描述
给出一个数组,求每个位置,不包含该数的乘积。要求复杂度为O(n)
解决
方法一
先求出所有数的乘积,然后再做判断,主要有三种情况,0个0,1个0,大于等于2个0。(但是要用到除法,不知道为什么还是过了)。
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
int lenth = nums.size();
if (lenth == 0){
return nums;
}
int product = 1;
int cnt = 0;
for (int i = 0; i < lenth; ++i){
if (nums[i] != 0){
product *= nums[i];
continue;
}
if (nums[i] == 0){
++cnt;
continue;
}
}
for (int i = 0; i < lenth; ++i){
if (cnt >= 2){
nums[i] = 0;
continue;
}
if (nums[i] != 0 && cnt == 0){
nums[i] = product / nums[i];
}
else if (nums[i] == 0){
nums[i] = product;
}
else if (nums[i] != 0 && cnt == 1){
nums[i] = 0;
}
}
return nums;
}
};
方案二
直接两次遍历,分别计算左右两边的乘积。
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
int lenth = nums.size();
if (lenth == 0){
return nums;
}
vector<int> res(lenth, 1);
int l = 1, r = 1;
for (int i = 0; i < lenth; ++i){
res[i] = l;
l *= nums[i];
}
for (int i = lenth - 1; i >= 0; --i){
res[i] *= r;
r *= nums[i];
}
return res;
}
};