1. 程式人生 > 其它 >No.011 Container With Most Water

No.011 Container With Most Water

11. Container With Most Water

  • Total Accepted: 86363
  • Total Submissions: 244589
  • Difficulty: Medium

  Given n non-negative integers a1a2, ..., an, where each represents a point at coordinate (iai). n vertical lines are drawn such that the two endpoints of line i is at (iai) 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 }