题目描述
给定长度为 n 的整数数组 nums
,其中 n > 1,返回输出数组 output
,其中 output[i]
等于 nums
中除 nums[i]
之外其余各元素的乘积。
示例:
输入:[1,2,3,4]
输出:[24,12,8,6]
说明: 请不要使用除法,且在 O(n) 时间复杂度内完成此题。
进阶:
你可以在常数空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的,输出数组不被视为额外空间。)
题解1
除自身以外数组的乘积可以看成:这个数左边所有数的乘积与这个数右边所有数的乘积相乘。
只需要扫描数组两遍即可,时间复杂度为:
O
(
n
)
O(n)
O(n),空间复杂度为:
O
(
1
)
O(1)
O(1)。
代码1
/*
参考的官方的题解
乘积 = 左边的乘积 * 右边的乘积
*/
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
int len = nums.size(), tmp = 1;
vector<int>res(len, 1);
tmp = 1;
//计算左边的乘积
for(int i = 1; i < len; ++i){
tmp = tmp * nums[i - 1];
res[i] = res[i] * tmp;
}
tmp = 1;
//计算右边的乘积
for(int i = len - 2; i >= 0; --i){
tmp = tmp * nums[i + 1];
res[i] = res[i] * tmp;
}
return res;
}
};