面试经典-除自身以外数组的乘积
除自身以外数组的乘积 题解
题目详情
给你一个整数数组
nums,返回 数组answer,其中answer[i]等于nums中除nums[i]之外其余各元素的乘积 。题目数据 保证 数组
nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。请 不要使用除法,且在
O(n)时间复杂度内完成此题。示例 1:
输入: nums = [1,2,3,4]
输出: [24,12,8,6]示例 2:
输入: nums = [-1,1,0,-3,3]
输出: [0,0,9,0,0]提示:
2 <= nums.length <= 105-30 <= nums[i] <= 30- 保证 数组
nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内进阶:你可以在
O(1)的额外空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的,输出数组 不被视为 额外空间。)
解题思路与题解
此题题目已经很明确了,解题思路,我主要推荐空间换时间
题解一
当然,老套路,这种题的暴力解法
1 | public static int[] productExceptSelf(int[] nums) { |
当然超时也是在意料之中的

题解二
在描述解法二的时候,我们来回忆一下,什么是前缀积,什么是后缀积
简单来说:前缀和就是从左到右,依次将前面的数相乘 后缀和就是从右到左,依次将后面的数相乘
在本题就是一个经典的前缀积和后缀积糅杂在一起的题目
下面是一个解题步骤
nums[] = [1,2,3,4] 执行一次前缀积之后变成 => [1,2,6,24]
因为本题要求不包含本身,所以
nums[] = [1,2,3,4] 执行一次前缀积之后变成 => [1,1,2,6]
所以,在执行一次前缀积之后必然有一个数,执行了全部的乘积,如果此时我们再执行一次后缀积,那么就能达到题目所想要的结果了
1 | public static int[] productExceptSelfB(int[] nums) { |

题解三
有兴趣的同学可以尝试理解下,本质就是维护两个指针,beforeSum表示前缀和,afterSum表示后缀和,在一个for循环中进行解决
1 | public static int[] productExceptSelf(int[] nums) { |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 可乐大红袍🥤🥤🥤!