給定乙個整數陣列nums
,返回區間和在[lower, upper]
之間的個數,包含lower
和upper
。
區間和s(i, j)
表示在nums
中,位置從i
到j
的元素之和,包含i
和j (i ≤ j)
。
說明:最直觀的演算法複雜度是o(n^2)
,請在此基礎上優化你的演算法。
示例:
輸入: nums =[-
2,5,
-1], lower =-2
, upper =2,
輸出:3
解釋:3個區間分別是:[0
,0],
[2,2
],[0
,2],它們表示的和分別為:-2
,-1,
2。
由於要求區間和因此可以想到字首和陣列,設字首和陣列為presum
。
問題可以轉換為presum[j] - presum[i] 屬於[lower, upper]
如果給定兩個公升序排列的陣列n1,n2
, 嘗試找出下標對(i, j)
, 滿足:n2[j] - n1[i] 屬於[lower, upper]
由於兩個陣列是公升序排列的所以只需要在n2
中維護兩個指標l, r
, 一開始都指向n2
的起始位置,首先考慮n1
的第乙個元素,l
向有移動知道找到乙個元素使n2[l] - n1[0] >= lower
為止,這樣l
右側的元素均大於n1[0] + lower
, 再移動r
指標,直到n2[r] - n1[0] > upper
這樣r
左側的元素均小於等於n1[0] + upper
,所以區間[l, r)
的所有下標j
都滿足n2[j] - n1[i] 屬於[lower, upper]
。下面繼續考察n1
的第二個元素,由於n1
是遞增的所以l, r
繼續向右移動。 在上述過程中對於n1
的每乙個下標都應記錄相應區間[l, r)
的大小,最終就統計得到了下標對(i, j)的數量。
leetcode327 區間和的個數
給定乙個整數陣列 nums,返回區間和在 lower,upper 之間的個數,包含 lower 和 upper。區間和 s i,j 表示在 nums 中,位置從 i 到 j 的元素之和,包含 i 和 j i j 說明 最直觀的演算法複雜度是 o n2 請在此基礎上優化你的演算法。示例 輸入 nums...
leetcode 327 區間和的個數 C語言
演算法思想 使用歸併排序的演算法思想 1.使用sums i 陣列放0 i 1的累加和,sums 0 0 2.對於任意的i j,lower sums i sums j upper滿足條件,則為一種可能的序列區間 3.對於有序的陣列,取符合條件的返回,可使用雙指標的方法。void print long ...
LeetCode 327 區間和的個數 歸併排序
求區間和,一般先構建字首和陣列進行資料預處理,可以 o 1 得到任意區間和。查詢元素,一般先進行排序,利用單調性可以快速的縮減查詢範圍,減少時間複雜度。歸併排序包含了兩個過程 從上往下的分解 把當前區間一分為二,直至分解為若干個長度為1的子陣列 從下往上的合併 兩個有序的子區域兩兩向上合併。對於本題...