238. 除自身以外数组的乘积 - 力扣(LeetCode)
题目
给你一个整数数组 nums
,返回 数组 answer
,其中 answer[i]
等于 nums
中除 nums[i]
之外其余各元素的乘积 。
题目数据 保证 数组 nums
之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。
请 不要使用除法,且在 O(n)
时间复杂度内完成此题。
示例 1:
输入: nums =[1,2,3,4]
输出:[24,12,8,6]
示例 2:
输入: nums = [-1,1,0,-3,3] 输出: [0,0,9,0,0]
提示:
2 <= nums.length <= 105
-30 <= nums[i] <= 30
- 输入 保证 数组
answer[i]
在 32 位 整数范围内
进阶:你可以在 O(1)
的额外空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的,输出数组 不被视为 额外空间。)
思路
- 因为不能使用除法,所以只能考虑前缀和后缀的乘法,且必须在遍历期间完成。
- 因为要求空间复杂度为O(1),且输出数组不视为额外空间,所以需要利用输出数组存储中间结果。
- 先用一次遍历完成前缀的乘法,再用一次遍历补齐后缀。
代码实现
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
int n = nums.size(), i, prefix = 1, suffix = 1;
vector<int> ans(n, 1);
for(i = 0; i < n; i++) {
ans[i] *= prefix;
prefix *= nums[i];
ans[n-1-i] *= suffix;
suffix *= nums[n-1-i];
}
return ans;
}
};
复杂度分析
- 时间复杂度:数组初始化和遍历的时间复杂度都是O(n)的,所以总的时间复杂度为O(n)。
- 空间复杂度:O(1)(输出数组不算)。
函数学习
- 数组的初始化方法:vector<type> v(n, m),初始化v的大小为n,用m来填充。
官方题解
- 比官方题解的好看,看我的(bushi)