LeetCode - 238. 除自身以外数组的乘积

题面

给你一个整数数组  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 <= $10^5$
  • $-30$ <= nums[i] <= $30$
  • 输入  保证  数组  answer[i]  在   32 位  整数范围内

思路

使用 vector 分别标记每个数前、后各变量的乘积,最后相乘。

基本是前缀思维,不过换成了乘积。

代码

初提交:4ms

class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) {
        int n = nums.size();
        vector<int> prefix(n,1);
        vector<int> suffix(n,1);
        vector<int> ans(n,1);
        for(int i=1;i<n;i++){
           prefix[i] = prefix[i-1] * nums[i-1];
        }
        for(int i=n-2;i>=0;i--){
           suffix[i] = suffix[i+1] * nums[i+1];
        }
        for(int i=0;i<n;i++){
            ans[i] = prefix[i] * suffix[i];
        }
        return ans;
    }
};

优化版: 0ms,空间复杂度更低

class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) {
        int n = nums.size();
        int prefix = 1, suffix = 1;
        vector<int> ans(n,1);
        for(int i=1;i<n;i++){
           ans[i] = prefix * nums[i-1];
           prefix*=nums[i-1];
        }
        for(int i=n-2;i>=0;i--){
           ans[i] *= suffix * nums[i+1];
           suffix*=nums[i+1];
        }
        return ans;
    }
};

后记

输入输出的开销还是稍微大了点。

cout<<prefix[i]<<" "<<suffix[i]<<" "<<prefix[i] * suffix[i]<<endl;

更初次的提交跟上面的第一个只差了这一句,1179ms,击败 9.47%的人。

还有什么是比 947 更有趣的吗

Just Programming With ♥️ & Peace
使用 Hugo 构建
主题 StackJimmy 设计