leetcode_303. Range Sum Query - Immutable

題目:

Given an integer array nums, find the sum of the elements between indices i and j (ij), inclusive.

Example:

Given nums = [-2, 0, 3, -5, 2, -1]

sumRange(0, 2) -> 1
sumRange(2, 5) -> -1
sumRange(0, 5) -> -3
在動態規劃的題目裏選的一道題。

給一個array,返回的是i到j相加的結果。

提示是:

/**
 * Your NumArray object will be instantiated and called as such:
 * NumArray obj = new NumArray(nums);
 * int param_1 = obj.sumRange(i,j);
 */

就是要寫一個類,裏面有變量是存了這個array,用這個類的sumRange方法返回這個變量的i到j的和。

咦,這個和動態規劃有個啥關係呢。。直接加複雜度不就是O(n)了嗎已經。

於是就很快寫了代碼,直接就通過了:

class NumArray {
public:
    NumArray(vector<int> nums) {
        numb = nums;
    }
    
    int sumRange(int i, int j) {
        int sum = 0;
        for(int m = i; m <= j; m++){
            sum+=numb[m];
        }
        return sum;
    }
    
    vector<int> numb;
};

既然是動態規劃裏的題目,按道理肯定可以用動態規劃的方法。看了一下答案解析,哦原來還可以這樣。沒有強調NumArray裏面要存這個num,那他可以存前m項的和。如果要i到j的和,就用第j個減第i個。是簡單的動態規劃,而且調用這個函數的複雜度更低了。

代碼:

class NumArray {
public:
    NumArray(vector<int> &nums) {
        accu.push_back(0);
        for (int num : nums)
            accu.push_back(accu.back() + num);
    }

    int sumRange(int i, int j) {
        return accu[j + 1] - accu[i];
    }
private:
    vector<int> accu;
};




發佈了39 篇原創文章 · 獲贊 0 · 訪問量 4867
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章