目次
1. 質問分析
質問リンク: 1004. 連続する 1 の最大数 III - Leetcode
この質問は理解するのが難しいことではありません。実際、1 の最長の連続部分配列を見つけることです。
ただし、k 個の 0 を 1 に反転する操作はサポートされています。
この条件が出ると、この質問の難易度はさらに上がり、状況はさらに複雑になってきました。
2. アルゴリズム原理
次に、ルールを抽象化する方法を考えます。
この問題を次のように変換します。k 個以下の 0 を含む最長の部分配列を見つけます。
暴力的な列挙を使用する場合、アイデアは比較的単純です。
強引な列挙に基づいて、スライディング ウィンドウを使用してこの問題を最適化できます。
実は、最も難しいステップは、変換問題はすでに終わっているので、このアイデアに基づいてスライディング ウィンドウを設計するだけです。
窓口を整備しておりますので、
0の数が2つ未満の場合、ウィンドウは継続的に拡張されます。
0 の数が 2 に等しい場合、最長の部分配列を記録します。
0 の数が 2 より大きい場合、0 の数が 2 以下になるまでウィンドウを縮小します。
コードを見てみましょう:
3. コードの書き方
class Solution {
public:
int longestOnes(vector<int>& nums, int k) {
unordered_map<int, int> win;
int len = 0, left = 0, right = 0;
while(right < nums.size()) {
len = max(len, right - left);
win[nums[right++]]++;
while(left < nums.size() && win[0] > k) {
win[nums[left++]]--;
}
}
len = max(len, right - left);
return len;
}
};
最後に次のように書きます。
以上がこの記事の内容です、読んでいただきありがとうございます。
何かを得たと感じたら、ブロガーに「いいね! 」を与えることができます。
記事の内容に漏れや間違いがある場合は、ブロガーにプライベートメッセージを送信するか、コメント欄で指摘してください〜