题解 | #盛水最多的容器#

盛水最多的容器

https://www.nowcoder.com/practice/3d8d6a8e516e4633a2244d2934e5aa47

一个思路不同的贪心

经典贪心思路是:当前要挪动一个指针,那么宽度必然减少1,既然宽度减少量是固定的,我们选择短的一边挪动,期待挪动后的木板会变长。
我的方法是,相比于把木板当作主体,我把水当作主体,给木板分配任务。我们知道,盛水量最大的时候,水面有可能是任何高度:可能是相距比较远的短板,也可能是相距比较近的长板。我们可以从水的高度出发,当水的高度为h时,找出能存最多水的两块木板,h = 1, 2, 3...n。在固定高度的情况下,能乘最多水的两块木板需要满足先后两个条件:
  1. 两块木板的高度都大于等于h
  2. 两块木板之间的距离尽可能的远
那么我们就可以开始贪心了:
  1. 首先设置最左和最右两个指针
  2. 当前需要装的水的高度设定为1
  3. 判断若左板高度不够1,那么挪动左板直到它能胜任;反之若右板无法胜任,挪动右板
  4. 若两板高度都满足了,这便是当前水高度下的最大盛水量,我们把它记录下来
  5. 将水面高度升高1,继续从第3步开始循环直到两个指针相遇
public int maxArea (int[] height) {
    int i = 0, j = height.length - 1;
    int h = 1, max = 0;
    while (i < j) {
        if (height[i] < h) { // 左板不达标
            i++;
        } else if (height[j] < h) { // 右板不达标
            j--;
        } else {
            max = Math.max(h++ * (j - i), max); // 记录水高度为h时的最大盛水量
        }
    }
    return max;
}


#算法题#
全部评论

相关推荐

给我发了笔试链接,想着等晚上回去做,结果还没做流程就终止了
伟大的小黄鸭在学习:我猜就是笔试几乎没用,就是用来给用人部门拖时间复筛简历的,可能用人部门筛到你简历觉得不合适就提前挂了
投递小鹏汽车等公司10个岗位
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务