238.除自身以外数组的乘积
我的解法:
题目要求要在O(n)时间复杂度内完成计算,因此使用空间换时间的方法。
定义两个长度为n的数组ans和back
- 数组ans的元素ans[i]用于记录从nums[0]至nums[i]的乘积;
- 数组back的元素back[j]用于记录从nums[n-1]至nums[j]的乘积。
可以用数组ans记录最终结果以节省空间,利用ans[i] = ans[i - 1] * nums[i]来计算最终结果,注意:由于这里会覆盖数组ans的原值,因此必须从后往前遍历计算。
另外,ans[0]和ans[n - 1]需特殊处理。
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
int n = nums.size();
vector<int> ans(n);
vector<int> back(n);
ans[0] = nums[0];
back[n - 1] = nums[n - 1];
for(int i = 1, j = n - 2; i < n ;++i,--j){
ans[i] = ans[i - 1] * nums[i];
back[j] = back[j + 1] * nums[j];
}
ans[n - 1] = ans[n - 2];
for(int i = n - 2; i > 0; --i){
ans[i] = ans[i - 1] * back[i + 1];
}
ans[0] = back[1];
return ans;
}
};