//238. 除自身以外数组的乘积
/*
* 1、暴力做法
* 创建两个数组,一个用于记录前缀乘积,一个记录后缀乘积
* 最后直接将两个数组对应的数字乘起来就是答案
* 时间:3n -> n
* 解释:记录前缀和后缀分别需要 n
* 遍历每个节点又需要 n
* 加起来就是 3*n
* 空间:2n -> n
* 解释:除了返回的数组,多用了两个具有n个元素的数组
* 所以是 2*n
*/
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
int n = nums.size();
vector<int>l(n, 1);
vector<int>r(n, 1);
for (int i = 1; i < n; i++) {
l[i] = l[i - 1] * nums[i - 1];
}
for (int i = n - 2; i >= 0; i--) {
r[i] = r[i + 1] * nums[i + 1];
}
vector<int>ans;
for (int i = 0; i < n; i++) {
ans.emplace_back(l[i] * r[i]);
}
return ans;
}
};
/*
* 2、常数空间
* 创建新数组当做返回的答案数组
* 从头开始,遍历第一遍,将答案数组变成前缀数组
* 从尾开始,遍历第二遍,直接在前缀数组的基础上,乘上后缀数组。
* 返回答案数组
* 时间:2*n -> n
* 解释:只遍历了两遍
* 空间:常数
* 解释:只新建了一个答案数组
*/
/*
* 这种方法其实也可以放在一起
* 只使用一个for循环,循环里面同时处理两端的数据
* 但是直接看这种代码的话,不好理解
* 所以把它分开了,其实时间、空间复杂度还有思路都是一样的。
*/
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
int n = nums.size();
vector<int>ans(n, 1);
int t = 1;
for (int i = 0; i < n; i++) {
ans[i] *= t;
t *= nums[i];
}
t = 1;
for (int i = n - 1; i >= 0; i--) {
ans[i] *= t;
t *= nums[i];
}
return ans;
}
};
LeetCode238. 除自身以外数组的乘积
最新推荐文章于 2023-08-27 15:54:18 发布