[LeetCode] 303. 區域和檢索 - 數組不可變

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);
 */
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章