题目描述
给定长度为 n 的整数数组 nums
,其中 n > 1,返回输出数组 output
,其中 output[i]
等于 nums
中除 nums[i]
之外其余各元素的乘积。
示例:
输入:
[1,2,3,4]
输出:
[24,12,8,6]
说明: 请不要使用除法,且在 O(n) 时间复杂度内完成此题。
思路
用递归肯定是或双循环肯定是O(n^2)级别的,所以用left和right两个数组分别保存从左至右的乘积和从右至左的乘积,观察:
如nums为[a,b,c,d]:
left数组为[a,ab,abc,abcd]
right数组为[abcd,bcd,cd,d]
res应该为[bcd,acd,abd,abc]
所以对于第二个数res[1] = left[0] * right[2],第三个数res[2] = left[1] * right[3],以此类推,首尾两个元素单独赋值。
代码
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
if(nums.empty())
return nums;
int n = nums.size();
vector<int> res(n,0);
vector<int> left(n,0);
vector<int> right(n,0);
int tmp1 = 1;
int tmp2 = 1;
for(int i=0;i<n;i++){ //这里用一次循环给两个数组赋值可以节省时间
tmp1 *= nums[i];
left[i] = tmp1;
tmp2 *= nums[n-i-1];
right[n-i-1] = tmp2;
}
for(int i=1;i<n-1;i++)
res[i] = left[i-1]*right[i+1];
res[0] = right[1];
res[n-1] = left[n-2];
return res;
}
};