LeetCode 最大子串行問題總結

2021-09-09 08:56:11 字數 1733 閱讀 9657

乘積最大子串行

給定乙個整數陣列 nums ,找出乙個序列中乘積最大的連續子串行(該序列至少包含乙個數)。

輸入: [2,3,-2,4]

輸出: 6

解釋: 子陣列 [2,3] 有最大乘積 6。

輸入: [-2,0,-1]

輸出: 0

解釋: 結果不能為 2, 因為 [-2,-1] 不是子陣列。

不用dp陣列,維護乙個到當前位置i的最大值mmax和最小值mmin

這裡mmaxmmin都是到當前i為止,區間[k,i]的最大值和最小值,k是不確定的,但i是一定的,也就是一定會由nums[i]作用。這樣保證了子串行的連續性

然後對於每一次迭代,更新res。就得到了到所有位置為止的最大值。

class solution 

else

res=

max(res,mmax);}

return res;}}

;

至少有k個重複字元的最長子字串

找到給定字串(由小寫字元組成)中的最長子串 t , 要求 t 中的每一字元出現次數都不少於 k 。輸出 t 的長度。

輸入:

s = 「aaabb」, k = 3

輸出:3

最長子串為 「aaa」 ,其中 『a』 重複了 3 次。

輸入:

s = 「ababbc」, k = 2

輸出:5

最長子串為 「ababb」 ,其中 『a』 重複了 2 次, 『b』 重複了 3 次。

滿足條件的最長子串dp思路可以總結一下,即兩遍遍歷,第一遍i:0

−>

ni:0->n

i:0−

>

n,第二遍j:i

−>

nj:i->n

j:i−

>n或j:i

−>

0j:i->0

j:i−

>0。

第二遍遍歷時,用到dp陣列,dp[

i][j

]dp[i][j]

dp[i][

j]的子問題條件是否成立,若成立,則在這個基礎上更新答案max

(res

,dp[

i][j

]+..

.)

max(res,dp[i][j]+...)

max(re

s,dp

[i][

j]+.

..),同時每步要視題目更新[i,

j]

[i,j]

[i,j

]區間的條件狀態。

這道題的難點是怎麼給乙個子串計數,看它每個字元出現的次數。

解法是使用mask,用位運算更新。每一位代表這個字元對應的狀態,1是不夠k次,0是夠k次。若mask是0,表示所有位都是0,即目前為止出現的所有字元都滿足條件。

class solution 

} i=max_idx+1;

}return res;}}

;

最大子串行問題

問題描述 輸入一組整數,求出這組數字子串行和中最大值。也就是只要求出最大子串行的和,不必求出最大的那個序列。例如 序列 2 11 4 13 5 2,則最大子串行和為20。複雜度為o n 2 的演算法 include include int maxsubseqsum const int a,int n...

最大子串行問題

現在我們將敘述兩個演算法來求解最大子串行和問題 include int maxsubsequencesum int a,int n int main printf max d maxsubsequencesum a,15 return0 int maxsubsequencesum int a 15 ...

最大子串行問題

題目 給定乙個整數列 可能有負數 求該整數列每個子串行的和的最大值,如果都為負數則結果為0 例如 對於輸入 2,11,4,13,5,2 答案為20 從11 到 13,即就是 11 4 13 20 粗略 如下 已測試通過 include using namespace std arr 目標陣列,len...