这道题22年做过一次,这是当时的解法,空间复杂度为O(1)
,思路为按照数组中有多少个0分析多种情况,按不同情况输出对应结果,详细见代码注释:
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
int n = nums.size();
vector<int> answer(n, 0);
int cnt0 = 0; // 数组中有多少0
int all = 1; // 数组中所有非0元素乘积结果
int pos = 0; // 数组中0所在的位置
for (int i = 0; i < n; i++) {
if (nums[i] == 0) {
cnt0++;
pos = i;
} else {
all *= nums[i];
}
}
//分情况分析
if (cnt0 > 1)
return answer;
else if (cnt0 == 1) {
answer[pos] = all;
return answer;
} else {
for (int i = 0; i < n; i++) {
answer[i] = all / nums[i];
}
}
return answer;
}
};
24年再做这道题,因为才做了Leecode 42. 接雨水 经典面试题 双指针/动态规划这道题,所以参考了其中用左右两个数组保存元素左右两边珠子最高值的做法,在这里改为:用左右两个数组保存元素左右两边的所有元素乘积,具体如下:
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
int n = nums.size();
vector<int> answer_l(n,1);//元素左边所有元素乘积结果
vector<int> answer_r(n,1);//元素右边所有元素乘积结果
vector<int> answer(n);
long long l = nums[0];
long long r = nums[n - 1];
for (int i = 1; i < n; i++) {
answer_l[i] = answer_l[i - 1] * nums[i - 1];
}
for (int i = n - 2; i >= 0; i--) {
answer_r[i] = answer_r[i + 1] * nums[i + 1];
}
for (int i = 0; i < n; i++) {
answer[i] = answer_l[i] * answer_r[i];
}
return answer;
}
};