11. Container With Most Water(C++)


時間計算量O(n^2)の方法、O(n)の方法をそれぞれ紹介します。

O(n^2)の方法

int maxArea(vector<int>& height) {
    int max_area = 0;
    for (size_t i = 0; i < height.size(); i++) {
        for (size_t j = height.size()-1; i < j; j--) {
            const int current_area = std::min(height[i], height[j]) * (j - i);
            max_area = std::max(current_area, max_area);
        }
    }
    return max_area;
}

問題文を読んでパッと思い浮かんだ方法です。とりあえずoutputは正しいものが出てきますが、LeetCodeでも仕事でもO(n^2)は避けたいところ……

O(n)の方法

結局「editional」を覗きました。

int maxArea(vector<int>& height) {
    int max_area = 0;
    size_t left = 0;
    size_t right = height.size() - 1;
    while (left < right) {
        const int current_area = std::min(height[left], height[right]) * (right - left);
        max_area = std::max(current_area, max_area);
        if (height[left] < height[right]) {
            left++;
        } else {
            right--;
        }
    }
    return max_area;
}

解説
LeetCodeの「editional」の記載が全てですが、一応記載すると、
最初は両端のheightからstartし、狭めていきながら面積を求めていく方法です。
ポイントは、左右のheightのindexを進める際に、低い方のみを中心に進めます。
高い方を中心へ進めても面積が増えることはないからです。

どっかの本で「自分で答えを探すならどうやるか」をコードに落とせば良い。と書いてあったのですが、なかなか難しいです。

以上です!

,

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です