今天偶然遇到一道單調棧的題目,順便複習下閒置已久的演算法知識,題目的意思大致就是給你乙個區間,找到子段和》=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 若是有符號整數 負數 原碼的補碼 ...