6.4——238. 除自身以外数组的乘积
238. 除自身以外数组的乘积
给你一个长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。
示例:
输入:[1,2,3,4]输出:[24,12,8,6]
提示:题目数据保证数组之中任意元素的全部前缀元素和后缀(甚至是整个数组)的乘积都在 32 位整数范围内。
说明: 请不要使用除法,且在 O(n) 时间复杂度内完成此题。
1.解题思路
由于要求时间复杂度为 O(n) ,说明循环里不能套循环。也不能用除法,说明不能用总的积除每个数。
那么可以用 左缀积 乘 右缀积 的方法求出每个数字的结果。因此,问题在于如何求出 左缀 和 右缀,在常规的方法中,可以遍历整个数组(for循环),然后从数组第一个元素到选定的元素累乘,即左缀。同理计算右缀(分别用1次for循环)。也就是在一个for循环中嵌套两个for循环,不满足时间复杂度要求。
那怎样才能用 O(n) 的时间复杂度求出 左缀 和 右缀 ,可以建立两个初始值为 1 的数组 L 和 R。其中的元素的值,通过 L[i] = L[i-1] * nums[i-1] 和 R[i] = R[i+1] * nums[i+1] 来求(一个数的 左缀 * 它本身 = 下一个数的左缀, 右缀同理)。然后循环地将 L[i] 乘 R[i] 计算出来
2.源码


浙公网安备 33010602011771号