leetcode_11. 盛最多水的容器

文章讲述了如何在给定高度数组的情况下,通过二分查找算法寻找两条垂直线,使它们与x轴构成的容器能容纳最多水。暴力法虽然思路直观但效率低,而二分查找法在O(n)时间内解决了问题,展示了算法优化的重要性。
摘要由CSDN通过智能技术生成

11. 盛最多水的容器

题目描述:给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。

说明:你不能倾斜容器。

示例 1:

输入:[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

提示:

  • n == height.length
  • 2 <= n <= 10^5
  • 0 <= height[i] <= 10^4
1.暴力

思路很好想,找到以每一个垂线开始的最大的面积,但是开销太大了,时间复杂度是O(n^2)

class Solution {
    public int maxArea(int[] height) {
        int n = height.length;
        int max = 0;
        for (int i = 0; i < n; i++) {
            for (int j = i + 1; j < n; j++) {
                int temp = 0;
                temp = Math.min(height[j], height[i]) * (j - i);
                if (temp > max) max = temp;
            }
        }
        return max;
    }
}
2.二分查找

为什么可以使用二分查找解决这个问题?

首先,我们可以观察到,容器的面积取决于两条垂线的最小高度和它们之间的距离。所以,我们可以认为,如果两条垂线之间的距离更远,那么只有当最小高度更高时,容器的面积才有可能更大。

现在,回到代码中的二分查找部分:

  • 初始化两个指针 leftright 分别指向数组的开头和结尾。
  • 计算当前两条垂线围成的容器面积,并更新最大面积 max
  • 如果 height[left] < height[right],则移动 left 指针向右,因为我们希望找到更高的垂线来可能得到更大的面积。
  • 否则,移动 right 指针向左。

这里的关键点是,通过比较两端的高度,我们可以确定哪一边的垂线更短。这时,移动短垂线的指针可能会找到更高的垂线,从而有可能得到更大的容器面积。这正是二分查找的精髓:在每一步中,我们都在可能的答案中进行搜索,并根据当前的比较结果来缩小搜索范围。

由于我们在每一步都将搜索范围减半,所以该算法的时间复杂度为O(n)

class Solution {
    public int maxArea(int[] height) {
        int left = 0;
        int right = height.length - 1;
        int max = 0;
        while (left < right) {
            max = Math.max(max, Math.min(height[left], height[right]) * (right - left));
            if (height[left] < height[right]) left++;
            else right--;
        }
        return max;
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咔咔哒

谢谢哇!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值