失败是抵达卓越的另一个踏脚石。

题目描述:

除自身以外数组的乘积

给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积

题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。

不要使用除法,且在 O(*n*) 时间复杂度内完成此题。

解题代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
int len = nums.size();
if(len == 0) return {};
vector<int> ans(len,1);
ans[0] = 1;
for(int i = 1; i < nums.size(); i++){
ans[i] = ans[i - 1] * nums[i - 1];
}
int tmp = 1;
for(int i = nums.size() - 2; i >= 0; i--){
tmp *= nums[i + 1];
ans[i] *= tmp;
}

return ans;
}
};

image-20231010190145639

解读与收获:

刚拿到题目,我还在窃喜,此题只要提前算出所有元素的乘积,再利用除法即可轻松解决,无奈发现题目要求不能用除法,遂作罢。其实要想求一个数除了自己本身,其他数的乘积无非就是三个步骤,第一步,求该数左边部分的乘积,第二步求右边部分的乘积,第三步两边乘积相乘,即可得到结果,于是在代码中,我用了两个循环,第一个循环是计算每个元素左边所有元素的乘积,第二个循环是用第一步的计算结果,乘右边部分,最终得到ans数组即是结果,题中还运用了动态规划,ans数组中的每一个元素,都可以看做是前一个元素乘nums数组上一个元素所得,没有重复计算,下面附几张大佬的解读图:

image-20231010190452079

image-20231010190502289