leetcode_238 除自身以外的数组乘积
1. 题意
除了自身外的乘积,题目要求不能用除法做。
2. 题解
不用除法做,那就用前后缀分解的方法做。
时间复杂度O(n)O(n)O(n)
- 两个数组记录前后缀乘积
class Solution {
public:vector<int> productExceptSelf(vector<int>& nums) {int n = nums.size();vector<int> pre(n);vector<int> suf(n);pre[0] = 1;for (int i = 1; i < n; ++i)pre[i] = nums[i - 1] * pre[i - 1];suf[0] = 1;for (int i = n - 1;i > 0; --i) {suf[n - i] = suf[n - i - 1] * nums[i];}vector<int> ans(n, 1);for (int i = 0;i < n; ++i)ans[i] = pre[i] * suf[n - 1 - i];return ans;}
};
事实上这个两个数组空间都可以直接优化掉,下面的空间复杂度为O(1)O(1)O(1)
class Solution {
public:vector<int> productExceptSelf(vector<int>& nums) {int n = nums.size();vector<int> ans(n, 1);int pre = 1;for (int i = 1;i < n; ++i) {pre *= nums[i - 1];ans[i] *= pre;}int suf = 1;for (int i = n - 2; ~i; --i) {suf *= nums[i + 1];ans[i] *= suf;}return ans;}
};```