1.区域和检索 - 数组不可变|刷题打卡

106 阅读1分钟

一、题目描述:

输入:

["NumArray", "sumRange", "sumRange", "sumRange"] [[[-2, 0, 3, -5, 2, -1]], [0, 2], [2, 5], [0, 5]]

输出: [null, 1, -1, -3]

解释:

NumArray numArray = new NumArray([-2, 0, 3, -5, 2, -1]);

numArray.sumRange(0, 2); // return 1 ((-2) + 0 + 3)

numArray.sumRange(2, 5); // return -1 (3 + (-5) + 2 + (-1))

numArray.sumRange(0, 5); // return -3 ((-2) + 0 + 3 + (-5) + 2 + (-1))

二、思路分析:

这道题比较坑的是标签是动态规划,虽然硬要说动态规划的话可以写状态转移方程

dp[i] = dp[i1] + nums[i];dp[i] \ = \ dp[i - 1] \ + \ nums[i];

但其实前缀和都已经贴脸上了,而且由于是简单题,也没什么难点直接走模板就可以了。

需要注意的是前缀和不要直接使用类似这个方程

dp[i] = dp[i1] + nums[i];dp[i] \ = \ dp[i - 1] \ + \ nums[i];

因为这样的话在求值的时候需要

return dp[j]  dp[i1];return \ dp[j] \ - \ dp[i - 1];

但这样的话在i等于0的时候会出现bug 因此需要将dp[0]置为0,然后依次顺延

三、AC 代码:

class NumArray {
public:
    vector<int> arr;
    NumArray(vector<int>& nums) {
        int ret = 0;
        for(int i = 0; i < nums.size(); i++){
            arr.push_back(ret);            
            ret += nums[i];
        }
        arr.push_back(ret); 
    }
    
    int sumRange(int i, int j) {
        return arr[j + 1] - arr[i];
    }
};

四、总结:

这破简单题,一点动态规划的精妙之处都没有体现,决定再找一道题写个文章。

本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情