给你一个长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。
难点:请不要使用除法,且在 O(n) 时间复杂度内完成此题。并且在常数空间内完成,输出数组不被视为额外空间 。
-------------------------------------------------------------------------------------------------------------------------------
原本以为多个循环会增加复杂度,最后发现只要不是嵌套循环就不会增加复杂度,因此时间复杂度不是本次问题的难点,并且不能保证不会出现数列中存在0的情况,因此将所有数相乘再除以对应位置的方法不能保证全部正确。
可以创建两个数组,一个用来存储i位置左侧的全部数值乘积,一个用来存储i位置右侧的全部数值乘积,通过两个循环得到这两个数组,最后在通过一个循环将两者对应位置相乘得到输出结果。但这样空间复杂度为n,如果能使用数组实现上述全部过程即可满足题目要求的;输出数组不被视为额外空间 下的常数空间复杂度。可以用一个数组记录第一个数组,一个常数动态记录右侧值,最后对应位置相乘更新第一个·循环得到的数组并输出。
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
int n=nums.size();
vector<int>answer(n);
answer[0]=1;
for(int i=1;i<n;++i)//此处使用1开始循环,因为0左侧的已经定义了
{
answer[i]=nums[i-1]*answer[i-1];
}
int right=1;
for(int i=n-1;i>=0;--i)//这里从n-1开始,因为n-1右侧的虽然已经定义了,但此时answer里面放的是最终输出值
{
answer[i]=answer[i]*right;
right*=nums[i];
}
return answer;
}
};