第四道、#303. 区域和检索 - 数组不可变
给定一个整数数组 nums,求出数组从索引 i 到 j (i ≤ j) 范围内元素的总和,包含 i, j 两点。
示例:
给定 nums = [-2, 0, 3, -5, 2, -1],求和函数为 sumRange()
sumRange(0, 2) -> 1
sumRange(2, 5) -> -1
sumRange(0, 5) -> -3
说明:
你可以假设数组不可变。
会多次调用 sumRange 方法。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/range-sum-query-immutable
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
1、暴力解法
时间复杂度:每次查询的时间 O(n),每个 sumrange 查询需要 O(n) 时间。
空间复杂度:O(1),请注意,data 是对 nums 的引用,不是它的副本。
class NumArray {
public: vector<int> date; //数据容器
public:
NumArray(vector<int>& nums) {
date = nums;
}
int sumRange(int i, int j) {
int sums = 0;
while(i<=j){
sums += date[i];
i++;
}
return sums;
}
};
2、前缀和
class NumArray {
private:
int* sum; //一个整形的指针;
public:
NumArray(vector<int>& nums) {
sum = new int [nums.size()+1]; //该指针指向一个元素为nums.size()+1的数组
sum[0] = 0; //记得sum[0]初始化为0,不然会报错;
for(int i = 1; i <= nums.size(); i++){ //循环的终止条件到数组的最后一个元素
sum[i] = sum[i-1] + nums[i-1]; //sum[i]的值为前nums的前i-1的和
}
}
~NumArray(){
delete[] sum; //注意记得释放内存空间,防止内存泄露
}
int sumRange(int i, int j) {
return sum[j+1] - sum[i]; //前j项和减去前i-1项和
}
};
3、哈希表
class NumArray {
private:
unordered_map<int , int> map; //创建一个哈希表,key为索引,value为前n项和
public:
NumArray(vector<int>& nums) {
int sums = 0;
for(int i = 0; i < nums.size(); i++){
sums += nums[i];
map[i] = sums;
}
}
int sumRange(int i, int j) {
return map[j] - map[i-1];
}
};