盛最多水的容器

这道题一开始的思路是用两层循环暴力解法,将所有结果列出来然后选最大的。当有这种两层循环暴力解法的想法时,就应该想到可能使用双指针进行优化。
- 使用双指针关键是:移动哪根针?
本题求的最大容器面积为:两边最小的那边*两边的距离
如果我们移动的是数值大的指针,那么容器面积的参数1不变,两边距离变小;移动数值小的指针,那么容器面积的参数1有变,可能变大或变小,两边距离还是变小,如果是变大那么最大容器面积就会变大。综上,移动小的那边。
class Solution {public int maxArea(int[] height) {int left=0;int right=height.length-1;int max=0;while(left<right){int area=Math.min(height[left],height[right])*(right-left);max=Math.max(area,max);if(height[left]<height[right]){left++;}elseright--;}return max;}}
优化
- 当移动指针时,下一个指针比当前指针还小,则继续移动,肯定更小所以不需要进行比较。
当两根指针相等时,可以让两根同时往后/前移动,因为不论其中一根往后/前移动,容器面积是受指向数值小的指针影响。
class Solution {public int maxArea(int[] height) {int left=0;int right=height.length-1;int max=0;while(left<right){int area=Math.min(height[left],height[right])*(right-left);max=Math.max(area,max);if(height[left]<height[right]){//用left++:先取left和right进行判断,然后再通过+1后的left判断while(left<right&&height[left]<height[left++]){left++;}}else if(height[left]>height[right]){while(left<right&&height[right]<height[right--]){right--;}}else{++left;--right;}}return max;}}
