力扣算法:盛最多水的容量
题目:
给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
说明:你不能倾斜容器。
来源:力扣(LeetCode) 链接:leetcode.cn/problems/co…
双指针解题思路
1.分析
设两指针i,j,指定的水槽板高度分别为h[ i ] h[ j ],此状态下水槽面积为 S(i, j),由于可容量水的决定因素是短板,由此得到以下公式
关于长板、短板的移动问题:
若向内移动长板,水槽的短板 min(h[i], h[j])min(h[i],h[j]) 不变或变小,下个水槽的面积一定小于当前水槽面积。“其实可以加一句,无论是移动短板或者长板,我们都只关注移动后的新短板会不会变长,而每次移动的木板都只有三种情况,比原短板短,比原短板长,与原短板相等;如向内移动长板,对于新的木板:1.比原短板短,则新短板更短。2.与原短板相等或者比原短板长,则新短板不变。所以,向内移动长板,一定不能使新短板变长。
算法流程:
- 初始化双指针 i , j ,初始化面积 res
- 循环收窄 直到双指针相遇,结束
- 更新最大面积 res
- 选定两板高度中最短板,向中间收窄
- 返回:最大值 res
代码:
class Solution {
public int maxArea(int[] height) {
// 双指针
int i=0;
int j = height.length-1;
int res= 0;
while (i<j) {
res = height[i]<height[j] ? Math.max(res,(j-i)*height[i++]) : Math.max(res,(j-i)*height[j--]);
}
return res;
}
}
最后:感谢力扣大佬提供的解题思路,对双指针有新的认识与感悟!