1 題目描述
給定一個整數數組 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
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
2 解題思路
- 方法一:暴力法
每次調用 sumrange 時,我們都使用for循環將索引 i 到 j 之間的每個元素相加。
複雜度分析
時間複雜度:每次查詢的時間 O(n),每個 sumrange 查詢需要 O(n) 時間。
空間複雜度:O(1),請注意,data 是對 nums 的引用,不是它的副本。
- 方法三:緩存
複雜度分析
時間複雜度:每次查詢的時間 O(1),O(N) 預計算時間。由於累積和被緩存,每個sumrange查詢都可以用 O(1) 時間計算。
空間複雜度:O(n).
作者:LeetCode
鏈接:https://leetcode-cn.com/problems/range-sum-query-immutable/solution/qu-yu-he-jian-suo-shu-zu-bu-ke-bian-by-leetcode/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
3 解決代碼
- 方法一:暴力法
class NumArray {
private int[] data;
public NumArray(int[] nums) {
data = nums;
}
public int sumRange(int i, int j) {
int sum = 0;
for(int k = i; k <= j; k++){
sum += data[k];
}
return sum;
}
}
- 方法三:緩存
class NumArray {
private int[] sum;
public NumArray(int[] nums) {
sum = new int[nums.length + 1];
for(int i = 0; i < nums.length; i++){
sum[i+1] = sum[i] +nums[i];
}
}
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);
*/