【算法训练】LeetCode#11 盛最多水的容器.md

一、描述

11. 盛最多水的容器

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

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

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

说明:你不能倾斜容器。

示例 1:

question_11

输入:[1,8,6,2,5,4,8,3,7]
输出:49 
解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。

示例 2:

输入:height = [1,1]
输出:1

二、思路

看到这道题,有一个好消息一个坏消息。

  • 好消息:前天笔试遇到这道题了;
  • 坏消息:先在笔试上遇到的,然后才在力扣上看到。/(ㄒoㄒ)/~~

这道题其实跟之前的一道hard难度的接雨水异曲同工,只是接雨水比这个考虑的情况更多,这道题用接雨水的思维做应该就可以了(但是笔试的时候没时间思考....就直接硬解了)。

接雨水

双指针控制矩形边界不断求围成的面积,返回最大值。

指针移动时,选择高度较小的一侧向高度较大的一侧移动,这是因为较小侧的高度已经不可能成为更大矩形面积的边界了:

image-20230217143841853

三、解题


public class LeetCode11 {
    public int maxArea(int[] height) {
        int left = 0;
        int right = height.length - 1;
        int ans = 0;
        while (left != right){
            int area = Math.min(height[left],height[right]) * (right-left);
            ans = Math.max(area,ans);
            if (height[left] <= height[right]){
                left++;
            } else {
                right--;
            }
        }
        return ans;
    }
}
posted @ 2023-02-17 14:39  小拳头呀  阅读(8)  评论(0编辑  收藏  举报