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

2022-08-11 07:57:10 字數 2340 閱讀 1691

2020-04-25 18:39:55

問題描述:

給定乙個正整數陣列 a,如果 a 的某個子陣列中不同整數的個數恰好為 k,則稱 a 的這個連續、不一定獨立的子陣列為好子陣列。

(例如,[1,2,3,1,2] 中有 3 個不同的整數:1,2,以及 3。)

返回 a 中好子陣列的數目。

示例 1:

輸入:a = [1,2,1,2,3], k = 2

輸出:7

解釋:恰好由 2 個不同整數組成的子陣列:[1,2], [2,1], [1,2], [2,3], [1,2,1], [2,1,2], [1,2,1,2].

示例 2:

輸入:a = [1,2,1,3,4], k = 3

輸出:3

解釋:恰好由 3 個不同整數組成的子陣列:[1,2,1,3], [2,1,3], [1,3,4].

1 <= a.length <= 20000

1 <= a[i] <= a.length

1 <= k <= a.length

問題求解:

直接去求解子區間有恰好k個不同的元素比較困難,如果替換為求解at most k的話就會容易很多。

時間複雜度:o(n)

public int subarrayswithkdistinct(int a, int k) 

private int helper(int nums, int k)

res += end - start + 1;

}return res;

}

相似題目:

1258. 漂亮子陣列

問題描述:

漂亮子陣列的定義是具有numodds個奇數元素的任何長度的陣列。 給定乙個由整數組成的陣列nums以及乙個整數numodds,找出該陣列中所有的漂亮子陣列。 只要子陣列的開始索引以及結束索引不一樣,那麼這兩個子陣列就不一樣。返回漂亮子陣列的數量。

樣例

示例 1:

輸入:

nums = [1, 2, 3, 4, 5]

numodds = 2

輸出: 4

解釋: 有4個子陣列中含有兩個奇數,例如: [1, 2, 3], [1, 2, 3, 4], [2, 3, 4, 5], [3, 4, 5].

示例 2:

輸入:nums = [2, 4, 6, 8]

numodds = 1

輸出: 0

解釋: 陣列中沒有奇數元素

注意事項

問題求解:

public int beautifulsubarrays(int nums, int numodds) 

private int helper(int nums, int k)

res += r - l + 1;

}return res;

}

1004. 最大連續1的個數 iii

問題描述:

給定乙個由若干 0 和 1 組成的陣列 a,我們最多可以將 k 個值從 0 變成 1 。

返回僅包含 1 的最長(連續)子陣列的長度。

示例 1:

輸入:a = [1,1,1,0,0,0,1,1,1,1,0], k = 2

輸出:6

解釋:

[1,1,1,0,0,1,1,1,1,1,1]

粗體數字從 0 翻轉到 1,最長的子陣列長度為 6。

示例 2:

輸入:a = [0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1], k = 3

輸出:10

解釋:[0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1]

粗體數字從 0 翻轉到 1,最長的子陣列長度為 10。

1 <= a.length <= 20000

0 <= k <= a.length

a[i] 為 0 或 1

問題求解:

實際就是求最大的子陣列,其中at most k個0。

public int longestones(int a, int k) 

res = math.max(res, end - start + 1);

}return res;

}

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

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

困難題,先想著dp掃瞄,但是會爆棧 主體思想仍然採用滑動視窗來進行 但是對於該題目,有乙個比較新的點,要利用腦經急轉彎思想把問題轉換一下 對於正好為k個不同元素組成的最長字串可以轉換為 最多由k個不同元素組成的字串 最多由k 1個不同元素組成的字串 這樣可以有效的降低複雜度,使得單次區間尋找即可找到...