暴力法與貪心法求解盛最多水的容器

盛最多水的容器

給你 n 個非負整數 a1,a2,…,an,每個數代表座標中的一個點 (i, ai) 。在座標內畫 n 條垂直線,垂直線 i 的兩個端點分別爲 (i, ai) 和 (i, 0)。找出其中的兩條線,使得它們與 x 軸共同構成的容器可以容納最多的水。

說明:你不能傾斜容器,且 n 的值至少爲 2。

暴力法

  • 固定left=[0,heightSize1]left=[0,heightSize-1],尋找right,使得height[right](rightleft)height[right]*(right-left)height[left](rightleft)height[left]*(right-left)最大。時間複雜度爲O(n2)O(n^2),空間複雜度爲O(1)O(1)
  • 代碼如下
int maxArea(int* height, int heightSize){
  
    
    int max_warter=0;
    for(int left=0;left<heightSize;left++){
        for(int right=left+1;right<heightSize;right++){
            if(height[left]<height[right]){
                max_warter=max(max_warter,height[left]*(right-left));
            }else
                max_warter=max(max_warter,height[right]*(right-left));
        }
    }
    return max_warter;
}


貪心法

  • 一個區間能夠容納水的面積=區間長度*min(左端點高度,右端點高度)
  • 如果min(左端點高度,右端點高度)相同則區間長度越大,能夠容納的水越多。如果區間長度相同,則min(左端點高度,右端點高度)越大,能夠容納的水越多。
  • 如果想讓面積最大則要麼增加區間長度,要麼使得min(左端點高度,右端點高度)增大。
  • 如果從最長區間開始依次縮小區間,而每次要縮小區間時,選擇留下高度最高的端點,就可以使得min(左端點高度,右端點高度)越大(捨去的區間的能夠容納的水一定比選擇的區間容納的水更少)。
  • 每次縮小區間要更新當前能夠容納水的最大面積max_warter=max(max_warter,(right-left)*min(height[left],height[right]));
  • 時間複雜度爲O(n)O(n),空間複雜度爲O(1)O(1)
  • 代碼如下
int maxArea(int* height, int heightSize){
    int left=0,right=heightSize-1;
    int max_warter=0;
    while(left<right){
        max_warter=max(max_warter,(right-left)*min(height[left],height[right]));
        if(height[left]>height[right]){
            right--;
        }else{
            left++;
        }
    }
    return max_warter;
}

相似題目 接雨水 Trapping Rain Water

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