No.011 Container With Most Water
阿新 • • 發佈:2022-04-29
11. Container With Most Water
- Total Accepted: 86363
- Total Submissions: 244589
- Difficulty: Medium
Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai). n vertical lines are drawn such that the two endpoints of line i is at (i, ai) and (i, 0). Find two lines, which together with x-axis forms a container, such that the container contains the most water.
Note: You may not slant the container.(不能傾斜容器)
思路:
這道題很簡單,大概意思是要找到兩條條縱線然後這兩條線以及X軸構成的容器能容納最多的水。而任意兩條線與x軸一起能裝的水的最大量就是兩條線在x軸的距離乘以較矮的那條線的高度即可。所以解題思路就很簡單了。
方法一:
暴力求法,求每一種情況下的最大裝水面積,然後比較是否最大,不是則下一種,是則替換為當前最大值。
1 public int maxArea2(int[] height) { 2 int n = height.length ; 3 if(height == null || n < 2){ 4 return 0 ; 5 } 6 int max = 0 ; 7 for(int i = 0 ; i < n ; i++){ 8 for(int j = i+1 ; j < n ; j++){ 9 int low = height[i]<height[j]?height[i]:height[j] ; 10 int area = low*(j-i)/2 ; 11 max = max>area?max:area ; 12 } 13 } 14 return max ; 15 }
方法二:
最大盛水量取決於兩邊中較短的那條邊,而且如果將較短的邊換為更短邊的話,盛水量只會變少。所以我們可以用兩個頭尾指標,計算出當前最大的盛水量後,將較短的邊向中間移,因為我們想看看能不能把較短的邊換長一點。這樣一直計算到左邊大於右邊為止就行了。
注意:如果將較短的邊向中間移後,新的邊還更短一些,其實可以跳過,減少一些計算量
1 public int maxArea(int[] height) { 2 3 int n = height.length ; 4 if(height == null || n < 2){ 5 return 0 ; 6 } 7 int max = 0 ; 8 int left = 0 ; 9 int right = n-1 ; 10 while(left < right){ 11 int low = height[left]<height[right]?height[left]:height[right] ; 12 int area = low*(right-left) ; 13 max = max>area?max:area ; 14 if(low == height[left]){ 15 left++ ; 16 }else{ 17 right-- ; 18 } 19 } 20 return max ; 21 }