力扣算法:盛最多水的容量 - 双指针题解

113 阅读2分钟

力扣算法:盛最多水的容量

题目:

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

返回容器可以储存的最大水量。

说明:你不能倾斜容器。

来源:力扣(LeetCode) 链接:leetcode.cn/problems/co…

盛水最多的容器.png

双指针解题思路

1.分析

设两指针i,j,指定的水槽板高度分别为h[ i ] h[ j ],此状态下水槽面积为 S(i, j),由于可容量水的决定因素是短板,由此得到以下公式

盛水最多的容器-公式.png

关于长板、短板的移动问题:

若向内移动长板,水槽的短板 min(h[i], h[j])min(h[i],h[j]) 不变或变小,下个水槽的面积一定小于当前水槽面积。“其实可以加一句,无论是移动短板或者长板,我们都只关注移动后的新短板会不会变长,而每次移动的木板都只有三种情况,比原短板短,比原短板长,与原短板相等;如向内移动长板,对于新的木板:1.比原短板短,则新短板更短。2.与原短板相等或者比原短板长,则新短板不变。所以,向内移动长板,一定不能使新短板变长。

算法流程:

  1. 初始化双指针 i , j ,初始化面积 res
  2. 循环收窄 直到双指针相遇,结束
    1. 更新最大面积 res
    2. 选定两板高度中最短板,向中间收窄
  3. 返回:最大值 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;
    }
}

最后:感谢力扣大佬提供的解题思路,对双指针有新的认识与感悟!