如何获取数组元素位置并生成排除自身的元素乘积数组
解决数组元素排除自身的乘积问题
嘿,这个问题我之前在项目里也碰到过,其实有两种靠谱的解决思路——从适合新手理解的暴力解法,到追求效率的最优解法,我给你一步步拆解清楚:
一、直观的暴力解法(适合理解基础逻辑)
这种方法最容易上手,核心就是逐个遍历每个元素的位置,然后计算数组中除了当前位置元素外所有元素的乘积。
怎么获取位置&排除元素?
- 获取位置:用循环的索引(比如
i)来定位当前元素在数组中的位置,nums[i]就是当前位置的元素。 - 排除元素:在嵌套循环里,判断遍历的索引
j是否等于当前索引i,如果不等于就参与乘积计算。
代码示例(Python)
def product_except_self(nums): n = len(nums) result = [] # 遍历每个元素的位置i for i in range(n): current_product = 1 # 遍历数组所有元素的位置j for j in range(n): # 排除当前位置的元素 if j != i: current_product *= nums[j] result.append(current_product) return result
测试验证
- 输入
[1,2,3],输出[6,3,2],符合预期; - 输入
[5,2,3,2,4],输出[48,120,80,120,60],完全匹配示例。
不过要注意,这种方法的时间复杂度是O(n²),如果数组元素特别多(比如上万条),运行效率会比较低,所以下面给你讲更高效的解法。
二、高效的左右乘积法(最优解)
这个方法的核心思路是分别计算每个元素左边所有元素的乘积、右边所有元素的乘积,最后把左右乘积相乘,得到的就是排除当前元素的总乘积,时间复杂度是O(n),空间复杂度几乎为O(1)(除了存储结果的数组)。
代码示例(Python)
def product_except_self(nums): n = len(nums) result = [1] * n # 初始化结果数组 # 第一步:计算每个元素左边所有元素的乘积,存入result left_product = 1 for i in range(n): result[i] = left_product left_product *= nums[i] # 第二步:计算每个元素右边所有元素的乘积,和左边乘积相乘得到最终结果 right_product = 1 for i in range(n-1, -1, -1): result[i] *= right_product right_product *= nums[i] return result
逻辑拆解
- 第一个循环从左到右遍历:
result[i]先存下i位置左边所有元素的乘积,然后更新left_product为包含当前元素的乘积,方便下一个位置使用; - 第二个循环从右到左遍历:把
i位置右边所有元素的乘积乘到result[i]里,这样result[i]就变成了左边乘积×右边乘积,也就是除了nums[i]之外所有元素的乘积。
这种方法不需要嵌套循环,效率高很多,而且也间接实现了“排除当前元素”的需求,不需要直接判断索引跳过元素。
内容的提问来源于stack exchange,提问作者Eduardo Quiñonez
相关产品推荐
相关产品推荐

