LeetCode 992 K 個不同整數的子陣列

2022-09-22 02:45:09 字數 807 閱讀 2271

困難題,先想著dp掃瞄,但是會爆棧;

主體思想仍然採用滑動視窗來進行;

但是對於該題目,有乙個比較新的點,要利用腦經急轉彎思想把問題轉換一下;

對於正好為k個不同元素組成的最長字串可以轉換為:

最多由k個不同元素組成的字串-最多由k-1個不同元素組成的字串;

(這樣可以有效的降低複雜度,使得單次區間尋找即可找到符合要求的字串)

可以想象出,我們只需要尋找k個不同元素組成的字串即可;

但是針對於該問題,統計字串個數也有乙個小tip;

當我們確定乙個字串為k個不同元素組成的字串,那麼他的子串也必定是對多由k個不同元素的組成的字串;

因此,每次right和left確定區間,首先要找到當前的最長k個不同元素組成的字串,然後統計子陣列個數,即為right-left+1;

例如:1,2,1,2,4;

對於,1,2,1,2序列,可以有4個子序列:

1,2,1,2

2,1,2

1,2所以可見,正好為k個整數的序列和最多為k個整數的序列都包含在內;

當遇到大於k的序列,立刻調整left指標,重新選找下乙個符合條件的序列;

對於序列內不同元素計數,採用map計數即可;

class

solution

le++;

}res += ri - le + 1

; ri++;

}return

res;

}int subarrayswithkdistinct(vector& a, int

k) };

Leetcode 992 K 個不同整數的子陣列

可以將問題簡化為求一次不同元素個數小於等於k和求一次不同元素個數小於等於k 1的子陣列的個數,然後再做差。求不同元素個數小於等於k的子陣列的個數可以用滑動視窗來實現。右端視窗每移動一次對答案的貢獻為right left 當前區間大小 class solution ans right left 對答案...

LeetCode 992 K 個不同整數的子陣列

題目鏈結 給定乙個正整數陣列 a,如果 a 的某個子陣列中不同整數的個數恰好為 k,則稱 a 的這個連續 不一定不同的子陣列為好子陣列。例如,1,2,3,1,2 中有 3 個不同的整數 1,2,以及 3 返回 a 中好子陣列的數目。輸入 a 1,2,1,2,3 k 2 輸出 7 解釋 恰好由 2 個...

滑動視窗 992 K 個不同整數的子陣列

2020 04 25 18 39 55 問題描述 給定乙個正整數陣列 a,如果 a 的某個子陣列中不同整數的個數恰好為 k,則稱 a 的這個連續 不一定獨立的子陣列為好子陣列。例如,1,2,3,1,2 中有 3 個不同的整數 1,2,以及 3。返回 a 中好子陣列的數目。示例 1 輸入 a 1,2,...