Leetcode-303-區(qū)域和檢索-數(shù)組不可變(線段樹(shù)、前綴和)

一、題目

給定一個(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/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容