【LeetCode 238】Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务

113 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务活动详情

一、题目描述

给定一个数组 nums,求一个数组 ans ,ans[i] 等于 nums 中 除了 nums[i]之外的其余各元素的乘积。 说得土一点,就是求 剔除当前位置后的所有数字的乘积之和,且不能使用除法。

二、思路分析

朴素做法: 循环两次,暴力算

不朴素的做法: 先求一下前缀积和后缀积,之后就可以 O(1) 求出每个位置的 ans 了。

三、AC代码

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

四、总结

该题为中等题,适合练练手感。 前缀和问题在算法中非常常见,属于基本操作,大多数时候是非常有用的,可以有效降低我们的复杂度,提高信息的利用率。只是这题比较裸,不容易 get 到它的好用之处。