一道單調棧的題目

2021-10-11 18:57:41 字數 1147 閱讀 2099

今天偶然遇到一道單調棧的題目,順便複習下閒置已久的演算法知識,題目的意思大致就是給你乙個區間,找到子段和》=k的乙個最小子段。

子段問題的關鍵是字首和,先求一下

int sum[

50005]=

;for

(int i=

0;i) sum[i+1]

= sum[i]

+ a[i]

;

緊接著,關鍵就是維持乙個單調棧,下面解釋一下什麼是單調棧,先給一段**

deque<

int> dq;

//雙端佇列資料結構

for(

int i=

0;i<=len;i++

) dq.

push_back

(i);

}

舉個例子 [1,3,-4,5,-7] 字首和[1,4,0,5,-2]

單調棧遍歷過程中變化(記錄下標)

i=0: 0

i=1: 單調上公升 push 1,deque中為0,1

i=2: 不單調了,重新來 pop掉0和1,push 2 即deque中的數為下標2

i=3: 單調,push 3,deque中為2,3

i=4:不單調,pop掉2,3,push進4,即deque中為4

基於單調棧,如何找到子段和》=k的乙個最小子段呢,如下所示:

class

solution

;// sum[0]=a[0];

for(

int i=

0;i) sum[i+1]

= sum[i]

+ a[i]

; deque<

int> dq;

int ans = len+1;

for(

int i=

0;i<=len;i++

)while

(!dq.

empty()

&& sum[i]

>=sum[dq.

front()

]+ k)

dq.push_back

(i);

}return ans1?ans:-1

;}};

一道this的題目

請問下面 中的this值指向的是全域性物件還是物件o?function f return c var o new f console.log o.constructor.name object這裡的this指向全域性物件,因為 c call without new。這裡用正常的方式呼叫的函式 c 所...

一道題目 intel

從序列中找四個四字子串形成十進位制數使之乘積最大 就是求四個最大的?我目前只想到如下辦法。這個題並不是關於複雜的演算法,其本意是要利用並行處理,但目前尚未考慮到 除了其中比較求最小值部分有希望用simd include int g teststring int main void int picke...

一道題目 移位

csdn上一道面試題 十進位制整數,計算對應的二進位制數包含多少個1,用位操作。int n 95625 int m 1 int num 0 for int i 0 i sizeof int 8 i cout num endl 讓1不斷移位去判斷與其對應位置是否為1 若是有符號整數 負數 原碼的補碼 ...