一、題目大意
https://leetcode.cn/problems/range-sum-query-immutable
給定一個整數陣列 nums,處理以下型別的多個查詢:
計算索引 left 和 right (包含 left 和 right)之間的 nums 元素的 和 ,其中 left <= right
實作 NumArray 類:
NumArray(int[] nums) 使用陣列 nums 初始化物件
int sumRange(int i, int j) 回傳陣列 nums 中索引 left 和 right 之間的元素的 總和 ,包含 left 和 right 兩點(也就是 nums[left] + nums[left + 1] + ... + nums[right] )
示例 1:
輸入:
["NumArray", "sumRange", "sumRange", "sumRange"]
[[[-2, 0, 3, -5, 2, -1]], [0, 2], [2, 5], [0, 5]]
輸出:
[null, 1, -1, -3]
解釋:
NumArray numArray = new NumArray([-2, 0, 3, -5, 2, -1]);
numArray.sumRange(0, 2); // return 1 ((-2) + 0 + 3)
numArray.sumRange(2, 5); // return -1 (3 + (-5) + 2 + (-1))
numArray.sumRange(0, 5); // return -3 ((-2) + 0 + 3 + (-5) + 2 + (-1))
提示:
-
1 <= nums.length <= 104
-
-105 <= nums[i] <= 105
-
0 <= i <= j < nums.length
-
最多呼叫 104 次 sumRange 方法
二、解題思路
這道題讓我們檢索一個陣列的某個區間的所有數字之和,題目中給了兩個條件,首先陣列內容不會變化,其次有很多的區間和檢索,那么我們用傳統的遍歷相加來求每次區間和檢索,十分的不高效,而且無法通過OJ,所以這道題的難點就在于是否能想到來用建立累計直方圖的思想建立一個累計和的陣列dp,其中dp[i]表示[0,i]區間的數字之和,那么[i,j]就可以表示為dp[j]-dp[i-1],這里要注意一下當i=0時,直接回傳dp[j]即可,
三、解題方法
3.1 Java實作
class NumArray { int[] dp; public NumArray(int[] nums) { dp = new int[nums.length + 1]; for (int i = 1; i <= nums.length; i++) { dp[i] = dp[i-1] + nums[i-1]; } } public int sumRange(int left, int right) { return dp[right + 1] - dp[left]; } } /** * Your NumArray object will be instantiated and called as such: * NumArray obj = new NumArray(nums); * int param_1 = obj.sumRange(left,right); */四、總結小記
-
2022/8/17 買了一個大件,明天就能到
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/502139.html
標籤:其他
上一篇:紅日靶場(二)ATT&CK紅隊評估第一次打+復盤總結
下一篇:Kubernetes-概述
