当前位置: 首页 > news >正文

Leetcode11:盛水最多的容器

原题地址:. - 力扣(LeetCode)

题目描述:

给定一个长度为 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 <= 105
  • 0 <= height[i] <= 104

解题思路:

  1. 我们使用两个指针 l 和 r 分别指向数组的两端,l 从左往右移动,r 从右往左移动。
  2. 在每一步中,我们计算当前指针所指位置形成的矩形面积,这个矩形的宽度是 r - l,高度是 height[l] 和 height[r] 中的较小值,因为水的深度不能超过这两个高度中的较小者。
  3. 我们更新答案 ans 为当前计算的面积和之前答案中的最大值。
  4. 然后,我们根据 height[l] 和 height[r] 的大小决定指针的移动方向。如果 height[l] 小于等于 height[r],则增加 l,因为增加 l 可以增加矩形的宽度,并且不会减少矩形的高度。反之,如果 height[l] 大于 height[r],则减少 r
  5. 这个过程一直持续到两个指针相遇,此时我们已经考虑了所有可能的矩形,并且找到了能够容纳最大雨水量的矩形

实现源码:

class Solution {public int maxArea(int[] height) {// 初始化左右指针int l = 0, r = height.length - 1;// 初始化最大面积为0int ans = 0;// 当左指针小于右指针时,循环继续while (l < r) {// 计算当前指针所指位置形成的矩形面积int area = Math.min(height[l], height[r]) * (r - l);// 更新最大面积ans = Math.max(ans, area);// 如果左边的高度小于等于右边的高度,移动左指针if (height[l] <= height[r]) {++l;}// 否则,移动右指针else {--r;}}// 返回最大面积return ans;}
}

复杂度分析:

时间复杂度分析:

  • 这个算法的时间复杂度是 O(n),其中 n 是数组 height 的长度。这是因为我们只需要遍历一次数组,每次移动指针 l 或 r 一次。

空间复杂度分析:

  • 这个算法的空间复杂度是 O(1),因为我们只使用了常数个额外的变量来存储指针和最大面积,不依赖于输入数组的大小。

http://www.mrgr.cn/news/59513.html

相关文章:

  • nginx 路径匹配,关于“/“对规则的影响
  • PHP+REDIS设置请求限流(设置1秒内最大请求数1000QPS)
  • 【MySQL】:数据库基础
  • supermall项目上拉加载bug分析
  • springboot多模块打包时出现Could not resolve dependencies for project
  • Web应用框架-Django应用基础(3)-Jinja2
  • 【C++刷题】力扣-#495-提莫攻击
  • STATCOM静止同步补偿器原理及MATLAB仿真模型
  • 多文档快速合并
  • LeetCode题练习与总结:回文对--336
  • 008:光盘映像文件处理工具UltraISO安装教程
  • Python实现基于HANTS算法(时间序列谐波分析法)的长时间序列数据去噪、重建、填补
  • 【汇编语言】第一个程序(二)—— 带你真正了解一个源程序的结构是怎样的
  • 背包九讲——二维费用背包问题
  • 基于SSM平面设计课程在线学习系统的设计
  • 504 Gateway Time-outopenresty
  • 684. 冗余连接
  • w~视觉~合集10
  • 深度学习模型预测控制python tensorflow 实现
  • Rust 力扣 - 3. 无重复字符的最长子串
  • Spring Cache-基于注解的缓存
  • 以蚂蚁借呗、抖音放心借、美团借钱为例,聊聊企业如何计算期末资产收益率
  • C++和OpenGL实现3D游戏编程【连载16】——详解三维坐标转二维屏幕坐标(向量和矩阵操作实战)
  • (六)问题记录,simulink仿真出现模型碰撞后穿越
  • 【ChatGPT】如何利用ChatGPT进行复杂任务的分解
  • 100种算法【Python版】第13篇——埃拉托斯特尼素数筛法