给你一个长度为 n 的整数数组 nums
,其中 n > 1,返回输出数组 output
,其中 output[i]
等于 nums
中除 nums[i]
之外其余各元素的乘积。
示例:
输入:[1,2,3,4]
输出:[24,12,8,6]
提示:题目数据保证数组之中任意元素的全部前缀元素和后缀(甚至是整个数组)的乘积都在 32 位整数范围内。
说明: 请不要使用除法,且在 O(n) 时间复杂度内完成此题。
进阶:
你可以在常数空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的,输出数组不被视为额外空间。)
思路:一次遍历即可完成,但是只打败了6%的人,只能说大家太强了
不难想到,索引i的值就是左边所有的数乘上右边所有的数,而从前往后,和从后往前是相互独立的,在遍历一次过程中可以计算的到没一步两个方向的累积,然后同时作用在所需返回的结果上,就解决了,简单粗暴,也符合题目的复杂度要求。
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
int N = nums.size();
vector<int> result(N,1);
int front = 1, end = 1;
for(int i=1;i<N;++i){
front *= nums[i-1];
end *= nums[N-i];
result[i] *= front;
result[N-1-i] *= end;
}
return result;
}
};