题目描述
给你一个整数数组 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]
题目分析
看到题目后,被题目后面的进阶要求O(1)的空间吓到了。最后没有分析出用什么做法来。后面看了题解,一下就弄懂咋回事了。
简单描述下题解。声明L[i]表示nums[i]的左边所有数的乘积和,R[i]为nums[i]右边的所有乘积和。然后左边的乘积和乘右边的就是答案了。O(1)空间的话,就是去除R[i],用一个数累乘nums[i]就可以取得同样的效果。题目本身是中等难度,不过感觉就是简单题。
前置知识
- vector L(len,0);//声明vector向量的时候同时申请长度,且将向量里面的值赋为0
- L[0]=1;//vector向量赋值形式
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
int len=nums.size();
int i=0,j=len;
vector<int> L(len,0);
vector<int> R(len,0);
L[0]=1;
R[len-1]=1;
for(i=1;i<len;i++)
{
L[i]=L[i-1]*nums[i-1];
}
for(j=len-1;j>0;j--)
{
R[j-1]=R[j]*nums[j];
}
for(int k=0;k<len;k++)
{
nums[k]=L[k]*R[k];
}
return nums;
}
};