题目描述
给你一个整数数组 nums
,返回 数组 answer
,其中 answer[i]
等于 nums
中除 nums[i]
之外其余各元素的乘积 。
题目数据 保证 数组 nums
之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。
请 不要使用除法,且在 O(n)
时间复杂度内完成此题。
示例
示例 1:
输入: nums = [1,2,3,4] 输出: [24,12,8,6]
示例 2:
输入: nums = [-1,1,0,-3,3] 输出: [0,0,9,0,0]
解法
1.暴力
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
int sum = 1;
vector <int> answer;
int num_0 = 0;
for(int i = 0;i < nums.size();i ++){
if(nums[i] == 0) num_0 ++;
else sum *= nums[i];
}
if(num_0 >= 2){
for(int i = 0;i < nums.size();i ++){
answer.push_back(0);
}
}
else{
for(int i = 0;i < nums.size();i ++){
if(num_0 == 1){
if(nums[i] == 0) answer.push_back(sum);
else answer.push_back(0);
}
else answer.push_back(sum / nums[i]);
}
}
return answer;
}
};
解题思路:
容易发现,answer的输出和nums中0的个数有关,定义一个num_0来统计0的个数,当num_0>=2时,answer全为0,当num_0= 1 时,只输出一个非0数,num_0 = 0时,输出全为非0数。用sum记录全数组的积,这样能轻易得到非0数答案。
时间复杂度:O(n),空间复杂度:O(1)
2.前后缀分解