leetcode11.盛最多水的容器
题目链接https://leetcode-cn.com/problems/container-with-most-water/
题目描述:给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。说明:你不能倾斜容器,且 n 的值至少为 2。
解题思路
设左右双指针left、right,分别位于两端容器壁,左右指针在符合移动规则的情况下向前或向后移动,在移动的过程中不断的比较面积最大值,直到left>right结束。
移动规则:设左边柱子的高度为height[left],右边柱子的高度为height[right],于是就有了以下规则。
当 height[left]>height[right],右指针应该往后移动一位,因为左边的柱子较高,如果让左指针向前移动,可能的结果就是容器的面积变小或不变,如果让右指针向后移动,可能会得到更长的柱子,那么容器的面积会变大。
注意:在求面积的过程中,决定容器面积的是较短的板,所以应该选择高度小的去求面积。
代码
class Solution {
public int maxArea(int[] height) {
int left=0,maxValue=0,right=height.length-1;
while(left<right) {
maxValue=Math.max(maxValue, (Math.min(height[right], height[left])*(right-left)));
if(height[right]>height[left]) {
left++;
}else {
right--;
}
}
return maxValue;
}
}
标签:数组、左右双指针