一、題目
給定一個(gè)整數(shù)數(shù)組 nums,求出數(shù)組從索引 i 到 j (i ≤ j) 范圍內(nèi)元素的總和,包含 i, j 兩點(diǎn)。
示例:
給定 nums = [-2, 0, 3, -5, 2, -1],求和函數(shù)為 sumRange()
sumRange(0, 2) -> 1
sumRange(2, 5) -> -1
sumRange(0, 5) -> -3
說(shuō)明:
你可以假設(shè)數(shù)組不可變。
會(huì)多次調(diào)用 sumRange 方法。
https://leetcode-cn.com/problems/range-sum-query-immutable/
二、解題思路
整體思路
1、前綴和解法
用空間換時(shí)間,提前把結(jié)果計(jì)算好,存放在數(shù)組里,后面可以直接簡(jiǎn)單計(jì)算獲取結(jié)果。
2、線段樹(shù)(大材小用了,還是看307題)
關(guān)鍵問(wèn)題
三、題解
暴力解法
每次查詢用for循環(huán)把i到j(luò)加一遍
復(fù)雜度分析
時(shí)間復(fù)雜度:O(n)
空間復(fù)雜度:O(1)
題解1: 前綴和
Java題解
class NumArray {
private int[] sum;
public NumArray(int[] nums) {
if (nums.length <= 0) {
return;
}
sum = new int[nums.length + 1];
// sum[0] = nums[0];
sum[0] = 0;
for (int i = 1; i < nums.length + 1; i++) {
// sum[i + 1] = sum[i] + nums[i];
sum[i] = sum[i - 1] + nums[i - 1];
}
}
public int sumRange(int i, int j) {
return sum[j + 1] - sum[i];
}
}
/**
* Your NumArray object will be instantiated and called as such:
* NumArray obj = new NumArray(nums);
* int param_1 = obj.sumRange(i,j);
*/
結(jié)果

image.png
復(fù)雜度分析
時(shí)間復(fù)雜度:O(1),預(yù)先計(jì)算是O(n)
空間復(fù)雜度:O(n)
題解2: 用hashmap
學(xué)習(xí)用map存儲(chǔ)一對(duì)數(shù)Pair
private Map<Pair<Integer, Integer>, Integer> map = new HashMap<>();
public NumArray(int[] nums) {
for (int i = 0; i < nums.length; i++) {
int sum = 0;
for (int j = i; j < nums.length; j++) {
sum += nums[j];
map.put(Pair.create(i, j), sum);
}
}
}
public int sumRange(int i, int j) {
return map.get(Pair.create(i, j));
}
四、測(cè)試數(shù)據(jù)
["NumArray","sumRange","sumRange","sumRange"]
[[[-2,0,3,-5,2,-1]],[0,2],[2,5],[0,5]]
參考
1、題解參考
2、優(yōu)秀題解
https://leetcode-cn.com/problems/range-sum-query-immutable/solution/qu-yu-he-jian-suo-shu-zu-bu-ke-bian-by-leetcode/