LeetCodeT11.盛最多水的容器

在這裏插入圖片描述

我的low代碼:

int maxArea(int* height, int heightSize) {
    int ans = 0, vol = 0;
    int i = 0, j = 0;

    for (i = 0; i < heightSize - 1; i++) {
        for (j = i + 1; j < heightSize; j++) {
            vol = (j - i) * (height[i] > height[j] ? height[j] : height[i]);
            if (vol > ans)
                ans = vol;
                
        }
    }

    return ans;
}

看了題解,原來可以用雙指針。

解題思路及優化代碼:


/*
    算法概述:雙指針法。開始時設置兩個指針,一頭一尾,每次向內移動短板,
    因爲如果移動長板的話,移動之後有兩種情況:
        第一種,新長板比原短板相等或者更長,那麼新短板與原短板一樣。
        第二種,新長板比原短板短,那麼新短板比原短板短。
    無論哪種情況,新短板都不可能比原短板長,而移動之後兩板只會更近,所以移動
    長板之後水槽面積只會減小,不可能增大。
    要使得新水槽的面積有可能更大,只能移動短板
*/
int maxArea(int* height, int heightSize) {
    int vol = 0, ans = 0;
    int s = 0, e = heightSize - 1;// 一頭一尾

    ans = (e - s) * (height[s] > height[e] ? height[e] : height[s]);// 初始化最大
    while (s < e) {// 一步步移動板子,直到一頭一尾重合
        if (height[s] > height[e])// 移動尾部的板
            e--;
        else// 移動頭部的板
            s++;
        vol = (e - s) * (height[s] > height[e] ? height[e] : height[s]);
        if (vol > ans)
            ans = vol;// 更新最大
    }

    return ans;
}

這個雙指針真是妙啊!速度一下子就上去了
在這裏插入圖片描述
參考https://leetcode-cn.com/problems/container-with-most-water/solution/container-with-most-water-shuang-zhi-zhen-fa-yi-do/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章