LeetCode11-盛水最多的容器
阿新 • • 發佈:2018-12-13
題目:
給定一個高度陣列,找出其中的兩條線,使得它們與 x 軸共同構成的容器可以容納最多的水。
思路
1. 暴力解法
由於題目中,要求的是找出其中的兩條線,與x軸構成的容器,也就是說,找出陣列中所有可能的兩個高度的組合,很顯然有種組合。
具體的遍歷思路
[0] [1-n]
[1] [2-n]
...
程式碼:
class Solution { public int maxArea(int[] height) { int maxarea = 0; for(int i = 0; i < height.length; i++){ for(int j = i+1; j < height.length; j++){ maxarea = Math.max(maxarea,Math.min(height[i],height[j])*(j-i)); } } return maxarea; } }
時間複雜度:O(n^2)
空間複雜度:O(1)
思路2:用雙指標,朝著area可能變大的方向搜尋
我們來看一下area的計算公式 area = min(height[l],height[r])*(r-l)
r-l肯定是不斷減小的
那麼,area主要就是由min(height[l],height[r])這一項決定的,那麼怎樣才能讓這一項變大呢?
顯然,只要讓這裡面的小值變大就行,也就是取裡面的小值,然後變索引,直到遇到比當前height大的索引。
也就是說,把最外邊的兩條height中的小值往大的變。
class Solution { public int maxArea(int[] height) { int l = 0; int r = height.length-1; int maxarea = 0; 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; } }
時間複雜度:O(n),只需要掃描一次
空間複雜度:O(1)
這道題的優化思路在於,
目標是得到最大的面積,那麼從area計算的方式出發,向area可能變大的方向搜尋即可。