327 區間和的個數

2021-10-10 08:40:29 字數 1663 閱讀 2538

給定乙個整數陣列 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...