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

LeetCode 11题“盛最多水的容器”

题目

https://leetcode.cn/problems/container-with-most-water/description/?envType=study-plan-v2&envId=selected-coding-interview

问题分析

LeetCode 11题“盛最多水的容器”要求在给定的一组垂直线中,找出两条线,使得它们与x轴共同构成的容器可以容纳最多的水。容器的容量由两条线之间的距离和较短线的高度决定。

解题思路

最直接的方法是枚举所有可能的线对并计算其容量,但这种方法的时间复杂度为O(n²),效率较低。更优的解法是使用双指针法:

  1. 初始化双指针:一个指向数组的开始(left),另一个指向数组的末尾(right)。
  2. 计算当前容量:使用当前左右指针所指的线计算容量,并更新最大容量。
  3. 移动指针:每次移动较短的那条线的指针(向内移动)。这是因为移动较长的线不会增加容量,而移动较短的线可能找到更高的线,从而增加容量。
  4. 重复步骤2-3:直到左右指针相遇。

这种方法的时间复杂度为O(n),因为只需要遍历一次数组。

代码实现

下面是使用C++实现的代码:

#include <vector>
using namespace std;class Solution {
public:int maxArea(vector<int>& height) {int left = 0;int right = height.size() - 1;int max_area = 0;while (left < right) {// 计算当前容量int current_area = min(height[left], height[right]) * (right - left);max_area = max(max_area, current_area);// 移动较短的线的指针if (height[left] < height[right]) {left++;} else {right--;}}return max_area;}
};

代码解释

  1. 初始化变量leftright分别指向数组的首尾,max_area用于记录最大容量。
  2. 循环条件:只要left小于right,就继续循环。
  3. 计算当前容量:容量由较短的线和两线之间的距离决定。
  4. 更新最大容量:如果当前容量大于已记录的最大容量,则更新。
  5. 移动指针:移动较短的线的指针,以寻找可能更大的容量。

这种方法通过贪心策略,逐步缩小搜索空间,确保在O(n)时间内找到最优解。

相关文章:

  • 云原生核心技术 (6/12): K8s 从零到一:使用 Minikube/kind 在本地搭建你的第一个 K8s 集群
  • JWT令牌如何在FastAPI中实现安全又高效的生成与验证?
  • 【docker n8n】windows环境如何挂载
  • 论文分享 _ Ladder:一种基于收敛的结构化图区块链_2025-06-10
  • 记录chrome浏览器的一个bug
  • 项目四.高可用集群_ansible
  • Java 数据结构和集合框架(二十二)
  • 区块链Web3项目的开发
  • Linux中shell的循环控制语句和函数讲解
  • 深度学习小项目合集-视频介绍下自取
  • Ansible小试牛刀
  • Spring Boot循环依赖全场景解析与终极解决方案
  • Cloudreve 私有云盘系统部署
  • 【WSL2】Windows11开启WSL2
  • 2025年渗透测试面试题总结-云南云钺信息安全(云南)有限公司[社招]技术工程师(题目+回答)
  • 麒麟系统集成开发环境Kylin-IDE初体验,菜鸟小白入门教程
  • ceph集群调整pg数量实战(上)
  • MyBatis的#和$符号详解(Java面试)
  • AtCoder Beginner Contest 408
  • 循环冗余码校验CRC码 算法步骤+详细实例计算
  • 网站优化成都哪里好/苏州关键词搜索排名
  • 家乐福网上商城下载/seo搜索引擎优化课后答案
  • 民政局网站建设方案/关键词排名优化软件价格
  • 广州越秀区封控区域/seo软件开发
  • 龙岩电商公司/锦绣大地seo
  • 青海网站建设公司/哪里可以做