给定长度为 n 的整数数组 nums
,其中 n > 1,返回输出数组 output
,其中 output[i]
等于 nums
中除 nums[i]
之外其余各元素的乘积。
示例:
输入:[1,2,3,4]
输出:[24,12,8,6]
说明: 请不要使用除法,且在 O(n) 时间复杂度内完成此题。
进阶:
你可以在常数空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的,输出数组不被视为额外空间。)
第一次代码
int i,j;
for(i=0;i<4;i++){
for(j=0;j<4;j++){
if(j!=i)
value[i]*=nums[j];
}
}
return value;
很显然运行超时,时间复杂度n平方
优化后的代码
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
vector<int> v(nums.size(),1);
int k=1,n=1;
for(int i=0;i<nums.size();i++){
v[i]*=k;
k*=nums[i];
}
for(int i=nums.size()-1;i>=0;i--){
v[i]*=n;
n*=nums[i];
}
return v;
}
};
算法思路
两次遍历数组,第一次求出数组中每个数后边所有数的乘积;
第二次从后向前遍历数组,在求出每个数前边数字的乘积。