11水が最も多いコンテナ(暴力的なダブルポインタ)

1.問題の説明:

n個の負でない整数a1、a2、...、anが与えられ、各数値は座標の点(i、ai)を表します。座標にn本の垂直線を描画します。垂直線iの2つの端点は(i、ai)と(i、0)です。2本の線を見つけ、x軸でそれらが形成するコンテナが最も多くの水を保持できるようにします。

注:コンテナーを傾けることはできず、nの値は2以上です。

ソース:LeetCode
リンク:https ://leetcode-cn.com/problems/container-with-most-water

2.思考分析:

①まず最初に、私たちが考え得る最も簡単なことは、ブルートフォースクラックです。可能な限りすべての結果を順番に試してください。2層サイクルを使用する必要があります。最初の層サイクルは左側の列を表し、2番目の層サイクルは2番目の層の列を表します。 2本の柱のうち短い方については、最後の小さい方は柱間の距離を掛けることで解決できます。この考え方は比較的簡単に考えられます。当初、この方法を使用すると、ブルートフォースクラックが通過することはありませんでした。前回のカラーバックルのテストケースでは、ほとんどブルートフォースでクラックされ、通常の再帰は合格できません。最後の1つまたは2つに多くのデータが設定されるため、タイムアウトが発生します。

②公式解答を読んだところ、主にダブルポインターの使用方法を分析することで解決し、2つのポインターを設定しました。右のポインタは右端の列を指します。どの列が短いかがわかると、短い列が移動し、結果が以前よりも大きくなる可能性があるため、どの列が内側に移動します。したがって、移動中に最大容量の2つの列が通過することを知るために計算を実行する必要があります。これは、カラーボタンの解決策の兄によっても証明されています。

3.コードは次のとおりです。

総当たりのコードは次のとおりです。

class Solution {
    public int maxArea(int[] height) {
        /*首先是可以使用暴力破解来解决的*/
        int max = 0;
        for (int i = 0; i < height.length - 1; ++i){
            for (int j = i + 1; j < height.length; ++j){
                int cur = Math.min(height[i], height[j]);
                max = Math.max(max, cur * (j - i));
            }
        }
        return max;
    }
}

公式のダブルポインターコードは次のとおりです。

class Solution {
    public static int maxArea(int[] height) {
        int maxarea = 0, l = 0, r = height.length - 1;
        while (l < r) {
            maxarea = Math.max(maxarea, Math.min(height[l], height[r]) * (r - l));
            if (height[l] < height[r])
                l++;
            else
                r--;
        }
        return maxarea;
    }
}

 

元の記事569件を公開 153のような 訪問数590,000+

おすすめ

転載: blog.csdn.net/qq_39445165/article/details/105447750