双指针:成最多水的容器
题目描述:整型数组存放“长方形”的宽,数组索引组成“长方形”长,求一个能装最多水的“长方形容器”。
输入:[1,8,6,2,5,4,8,3,7]
输出:49
求解思路1:暴力解法。双层循环,length=j-i,width=Math.min(w1,w2)
时间复杂度:O(n^2)
空间复杂度:O(1)
class Solution {public int maxArea(int[] height) {int result = 0;// i确定长方形的左端for (int i = 0; i < height.length; i++) {// j确定长方形的右端for (int j = i + 1; j < height.length; j++) {int length = j - i;int width = Math.min(height[i], height[j]);int area = length * width;result = Math.max(result, area);}}return result;}
}
但是代码提交会超时
求解思路2:双指针
面积的计算公式是area=length*width;
- 借用双指针,左指针在左端,右指针在右端,通过移动双指针来计算。
- 在双指针确定时(即length确定),当前最大的容器面积是:cur_area(cur_max)=length*width(min)。省去其余比cur_area小的计算。
- 遍历一遍计算所有的cur_area。然后在cur_area中找出最大面积。
class Solution {public int maxArea(int[] height) {// 长的左端int left = 0;// 长的右端int right = height.length - 1;int result = 0;while (left < right) {// 当前容器的最大长int curLength = right - left;// 当前容器的最大宽,盛水取决于最短板int curWidth = Math.min(height[left], height[right]);// 当前容器的最大值int curMaxArea = curLength * curWidth;// 记录大bossresult = Math.max(result, curMaxArea);// 循环的驱动,缩小范围,继续寻找if (height[left] < height[right]) {left++;} else {right--;}}return result;}
}
练习地址:11. 盛最多水的容器 - 力扣(LeetCode)