leetcode_303. Range Sum Query

来源:互联网 发布:centos 7 乱码 编辑:程序博客网 时间:2024/05/25 18:12

题目:

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

Example:

Given nums = [-2, 0, 3, -5, 2, -1]sumRange(0, 2) -> 1sumRange(2, 5) -> -1sumRange(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;};




0 0
原创粉丝点击