327 區間和的個數

2021-10-10 07:52:37 字數 2171 閱讀 6099

今天的題目還是看了一陣子(??)

!我是鏈結

意思是任意子區間內所有元素的和要在lowerupper之間,可以取等

所以題目中 [0,0] [2,2] 都指向各自位置的元素,[0,2] 就是從第0個元素 一直加到 第2 個元素 等於 2 . 所以這就是為什麼輸出是3.

class

solution

sum=nums[i]

;for

(int j=i+

1;jsize()

;++j)}}

return count;}}

;

很平常的超過時間限制了。

使用字首和依舊死得很慘。。。。

class

solution

// if(sum>=lower&&sum<=upper)count++;

// cout<

(int i=any_sum.

size()

-1;i>=0;

--i)

}return count;}}

;

看題解啦··············我是鏈結

class

solution

intmerge

(vector<

int64_t

>

&s,vector<

int64_t

>

&assist,

int l,

int r,

int low,

int up)

//以下為歸併排序中歸併過程

left = l;

int right = m +

1;mmp

int pos = l;

while

(left<= m || right <= r)

pos++;}

for(

int i=l;i<=r;i++

)s[i]

= assist[i]

;return cnt;}}

;

作者的意思是,利用字首和歸併排序1.字首和先求出所有的相應位置的和

2.歸併排序會把陣列分成若干區間,讓後兩兩相比較排序,從底向上的排序。

3.根據題目要求 成立條件就變成了:lower<=s[i]-s[j]<=upper

作者作圖表示的是歸併最後一層

這一塊是關鍵。

根據最後的成立條件:lower<=s[i]-s[j]<=upper ( i >j )

只要分組後的左邊某個之和作為基準

右邊能夠使得

- s[i0]-s[j]>=lower

- s[i1]-s[j]<=upper

那為什麼 成立條件集合是這個傢伙呢????

cnt += upper - lower

首先我們知道這是被排過序了(單看一邊)的吧(圖中是最後一層歸併了)

回想一下只使用字首和時,我們在左邊確定乙個錨點,從錨點的下乙個位置開始乙個乙個的減,若是滿足 lower<=sum<=upper 咱們就加上。

在歸併中 ,我們直接確定 當left=i有序陣列下最小的滿足 >=lower 的位置最大滿足 <=upper 的位置,兩者相減得到的長度表示,該區間內的元素都滿足 lower<= sum<=upper

好吧,剩下的就時歸併排序的樣子了,多敲敲就行。

327 區間和的個數

給定乙個整數陣列 nums,返回區間和在 lower,upper 之間的個數,包含 lower 和 upper。區間和 s i,j 表示在 nums 中,位置從 i 到 j 的元素之和,包含 i 和 j i j 說明 最直觀的演算法複雜度是 o n2 請在此基礎上優化你的演算法。想到了字首和,同時由...

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...