目录
描述
解法
盛水最多的容器_牛客题霸_牛客网
描述
给定一个数组height,长度为n,每个数代表坐标轴中的一个点的高度,height[i]是在第i点的高度,请问,从中选2个高度与x轴组成的容器最多能容纳多少水
1.你不能倾斜容器
2.当n小于2时,视为不能形成容器,请返回0
3.数据保证能容纳最多的水不会超过整形范围,即不会超过231-1
数据范围:
0<=ℎ𝑒𝑖𝑔ℎ𝑡.𝑙𝑒𝑛𝑔𝑡ℎ<=1050<=height.length<=105
0<=ℎ𝑒𝑖𝑔ℎ𝑡[𝑖]<=1040<=height[i]<=104
如输入的height为[1,7,3,2,4,5,8,2,7],那么如下图:
解法
双指针算法一般都不复杂,一般有快慢双指针,一般在链表操作会用到;左右双指针一般会用在数组类的题目。
本题是左右双指针,左指针是从0开始往右遍历,右指针是从 height.length -1 处往左遍历。当左指针在 0 处,右指针在 height.length -1 处,此时容器的底最长,但要想盛最多的水,就要让容器的底乘高数值最大,容器的高取左右两指针所指向的元素最小值。
当左指针指向的高比右指针所指向的高小,左指针往右前进 1;当左指针指向的高比右指针所指向的高大,右指针往左前进 1;当左指针指向的高和右指针所指向的高相等,无论是左指针右移 1 还是 右指针左移 1 都行,因为就算后面一步遇到一个更大的高,容器也只取两高度中最小的那个,不影响结果。
public int maxArea(int[] height) {int left = 0, right = height.length - 1;int res = 0;for (; left < right; ) {res = Math.max((right - left) * Math.min(height[left], height[right]),res);if (height[left] < height[right]) {left++;} else {right--;}}return res;}