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.源码

posted @ 2020-06-04 10:23  xiaoqichaoren  阅读(126)  评论(0)    收藏  举报