当前位置: 代码迷 >> 综合 >> 11、盛最多水的容器(双指针)
  详细解决方案

11、盛最多水的容器(双指针)

热度:16   发布时间:2024-01-29 08:51:53.0

解法1:二重循环,遍历数组,枚举出所有容器可能的容积,比较哪一个容积最大。

class Solution {public int maxArea(int[] height) {int Max = 0;int Area = 0;for ( int i=0; i<height.length-1; i++ ) {for ( int j=i+1; j<height.length; j++ ) {Area = (j-i)*Math.min(height[i], height[j]);if ( Area > Max ) {Max = Area;}}}return Max;}
}

解法2:双指针解法,一次遍历,双指针一头一尾开始移动,根据题意,所指向元素小的指针每次移动一个位置。因为容纳的水量是由   两个指针指向的数字中较小值?指针之间的距离   决定的。

如果我们移动数字较大的那个指针,那么前者「两个指针指向的数字中较小值」不但不会增加,后者「指针之间的距离」会减小,那么这个乘积会减小。因此,我们移动数字较大的那个指针是不合理的。因此,移动 数字较小的那个指针。

class Solution {public int maxArea(int[] height) {int Max = 0;int Area = 0;int left = 0; int right = height.length-1;while ( left < right ) {Area = (right-left)*Math.min(height[left], height[right]);if (Area > Max) Max = Area;if ( height[left] < height[right] ) {left ++;}else{right --;}}return Max;}
}

结论:两种方法的运行时间相差巨大:一个O(N),一个O(N?),3ms、476ms。

  相关解决方案