leetcode热题100(11) - 盛最多水的容器

Question

leetcode.cn/problems/co...

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

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

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

说明:你不能倾斜容器。

示例 1:

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

示例 2:

css 复制代码
输入:height = [1,1]
输出:1

提示:

  • n == height.length
  • 2 <= n <= 105
  • 0 <= height[i] <= 104

Solution

双指针

本题要求容纳最大的水量,实际上就是求两根线之间的最大面积。

在本题中,宽就是两条线的距离,高就是两条线中 的那条,因此我们可以考虑使用双指针法,左指针l指向0,右指针r指向nums.length-1 ,此时的面积为: min(nums[l],nums[r])*(r-l) ,我们可以将l 右移或者r 左移。

那么什么时候右移l ,什么情况下左移r 呢?不管是l 还是r在移动过程中,宽(r-l) 是减小的,而要保证宽度减少的情况下,面积还能增大,我们只能移动 的那条线,这样如果矮的那条线移动之后能变大,面积才有可能变大。因此每次循环我们都需判断lr 的大小,移动 的那条线,当lr 重合时,循环结束。

java 复制代码
static class Solution1 {

        public int maxArea(int[] height) {
            if (height.length == 0) {
                return 0;
            }
            int answer = 0;
            int l = 0;
            int r = height.length - 1;
            while (l < r) {
                int area = Math.min(height[l], height[r]) * (r - l); // 计算面积
                answer = Math.max(answer, area);

                // 矮的边移动
                if (height[l] < height[r]) {
                    l++;
                } else {
                    r--;
                }
            }
            return answer;
        }
    }

时间复杂度

O(n), n数组长度,我们需要依次访问每一个元素。

空间复杂度

O(1),需使用固定的几个变量。

相关推荐
??tobenewyorker12 分钟前
力扣打卡第二十一天 中后遍历+中前遍历 构造二叉树
数据结构·c++·算法·leetcode
贾全33 分钟前
第十章:HIL-SERL 真实机器人训练实战
人工智能·深度学习·算法·机器学习·机器人
GIS小天1 小时前
AI+预测3D新模型百十个定位预测+胆码预测+去和尾2025年7月4日第128弹
人工智能·算法·机器学习·彩票
满分观察网友z1 小时前
开发者的“右”眼:一个树问题如何拯救我的UI设计(199. 二叉树的右视图)
算法
森焱森2 小时前
无人机三轴稳定化控制(1)____飞机的稳定控制逻辑
c语言·单片机·算法·无人机
循环过三天2 小时前
3-1 PID算法改进(积分部分)
笔记·stm32·单片机·学习·算法·pid
闪电麦坤953 小时前
数据结构:二维数组(2D Arrays)
数据结构·算法
凌肖战3 小时前
力扣网C语言编程题:快慢指针来解决 “寻找重复数”
c语言·算法·leetcode
埃菲尔铁塔_CV算法3 小时前
基于 TOF 图像高频信息恢复 RGB 图像的原理、应用与实现
人工智能·深度学习·数码相机·算法·目标检测·计算机视觉
NAGNIP4 小时前
一文搞懂FlashAttention怎么提升速度的?
人工智能·算法