給定乙個整數陣列 nums,返回區間和在 [lower, upper] 之間的個數,包含 lower 和 upper。
區間和 s(i, j) 表示在 nums 中,位置從 i 到 j 的元素之和,包含 i 和 j (i ≤ j)。
說明:最直觀的演算法複雜度是 o(n2) ,請在此基礎上優化你的演算法。
想到了字首和,同時由於位置關係,可以考慮到歸併排序,令l為左待歸併排序陣列的起點,r1和r2為右歸併排序的起點,移動r1,直到presum[r1] - presum[l] >= lower時停止,移動r2直到presum[r2] - presum[l] > upper為止,此時r2 - r1就是區間和總數,然後移動l,注意r1和r2不用歸位,因為l移動presum[l]增大,r1和r2從只能當前位置繼續移動才能滿足條件。
class
solution
;//計算字首和
for(
int i =
0; i < nums.
size()
; i++
)int count =
merge_count
(presum,
0, presum.
size()
-1, lower, upper)
;return count;
}int
merge_count
(vector<
long
>
& presum,
int left,
int right,
int lower,
int upper)
int mid = left +
(right - left)/2
;int count =
merge_count
(presum, left, mid, lower, upper)
+merge_count
(presum, mid +
1, right, lower, upper)
;int l = left;
int r1 = mid +1;
int r2 = mid +1;
while
(l <= mid)
//移動r2,直到presum[r2] - presum[l] > upper
while
(r2 <= right && presum[r2]
- presum[l]
<= upper)
count +
= r2 - r1;
l++;}
//歸併排序
int len = right - left +1;
long tmp[len]
;int pos =
0, l_merge = left, r_merge = mid +1;
while
(l_merge <= mid && r_merge <= right)
else
}while
(l_merge <= mid)
while
(r_merge <= right)
for(
int i =
0; i < len; i++
)return count;}}
;
327 區間和的個數
今天的題目還是看了一陣子 我是鏈結 意思是任意子區間內所有元素的和要在lower和upper之間,可以取等 所以題目中 0,0 2,2 都指向各自位置的元素,0,2 就是從第0個元素 一直加到 第2 個元素 等於 2 所以這就是為什麼輸出是3.class solution sum nums i fo...
327 區間和的個數
題目描述 給定乙個整數陣列 nums,返回區間和在 lower,upper 之間的個數,包含 lower 和 upper。區間和 s i,j 表示在 nums 中,位置從 i 到 j 的元素之和,包含 i 和 j i j 說明 最直觀的演算法複雜度是 o n2 請在此基礎上優化你的演算法。示例 輸入...
leetcode327 區間和的個數
給定乙個整數陣列 nums,返回區間和在 lower,upper 之間的個數,包含 lower 和 upper。區間和 s i,j 表示在 nums 中,位置從 i 到 j 的元素之和,包含 i 和 j i j 說明 最直觀的演算法複雜度是 o n2 請在此基礎上優化你的演算法。示例 輸入 nums...