这题看似简单,不过两个要求很有意思:
1、不准用除法:最开始我想到的做法是全部乘起来,一项项除,可是中间要是有个0,这做法死得很惨。
2、空间复杂度O(1):题目说明了返回的那个数组不算进复杂度分析里面
做法:既然不用除法,对于某个数i, result[i] = 0到i - 1的乘积 X i + 1 到 n - 1的乘积
具体来说,先正向遍历,result[i] 存储的是 0 到i - 1的乘积,再反向遍历,乘上另一半,这就同时满足了时间复杂度和空间复杂度的要求
class Solution { public: vector<int> productExceptSelf(vector<int>& nums) { if(nums.empty()) return vector<int>(); vector<int> result(nums.size(), 1); int accums = 1; for(int i = 0; i < nums.size() ; i++){ result[i] = accums; accums *= nums[i]; } accums = 1; for(int i = nums.size() - 1; i >= 0; i--){ result[i] *= accums; accums *= nums[i]; } return result; } };