給定一個二進位制陣列 nums 和一個整數 k,如果可以翻轉最多 k 個 0,則返回陣列中連續 1 的最大個數。
示例 1:
輸入:nums = [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 後,最長的子陣列長度為 6。
示例 2:
輸入:nums = [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 後,最長的子陣列長度為 10。
提示:
- 1 <= nums.length <= 105
- nums[i] 不是 0 就是 1
- 0 <= k <= nums.length
題解:
一道簡單的滑動視窗題(雙指標), 用兩個指標(下標), 維護一個視窗, 視窗滿足裡面需要滿足視窗中0的個數不超過 k 個, 讓指標 r 從頭遍歷到尾, 對視窗的長度取 max 就是答案
ac程式碼👇
class Solution {
public:
int longestOnes(vector<int>& nums, int k) {
int res = 0;
// l 是滑動視窗的左邊界, r 是滑動視窗的右邊界, sum 是視窗中 0 的個數
for (int l = 0, r = 0, sum = 0; r < nums.size(); r ++)
{
if (nums[r] == 0) sum ++;
while (sum > k)
{
if (nums[l] == 0) sum --; // nums[l] == 0, 視窗減少一個 0
l ++;
}
res = max(res, r - l + 1); // qu max
}
return res; // return 答案
}
};
在我的雙指標專欄裡還有很多相關題目, 感興趣的同學可以去看看
總結
滑動視窗演算法是一種用於解決子陣列或子串問題的有效技巧.
常見型別:
-
固定長度的子陣列/子串:
- 問題:找到固定長度的子陣列或子串,並求其某些特徵(如最大或最小值、平均值等)。
- 例子:給定一個陣列和一個整數k,找到長度為k的子陣列的最大平均值。
-
可變長度的子陣列/子串:
- 問題:找到可變長度的子陣列或子串,使其滿足某些條件(如和等於某個值、包含某些字元等)。
- 例子:給定一個陣列,找到和等於某個值的最長子陣列。
-
最長或最短的子陣列/子串:
- 問題:找到滿足某些條件的最長或最短子陣列或子串。
- 例子:給定一個字串和一個整數k,找到包含最多k個不同字元的最長子串。
本題屬於第三種, 滿足某個條件的最長子陣列
滑動視窗演算法通常用於需要在線性時間內解決子陣列或子串問題的場景。這些問題的特徵通常包括尋找具有特定屬性的最長或最短子陣列/子串,以及滿足某些條件的子陣列/子串。這種技術透過動態調整視窗的大小,使得演算法能在高效的時間複雜度內找到問題的解。
覺得寫的不錯的話, 點個贊吧~