首页 > 其他分享 >11. 盛最多水的容器

11. 盛最多水的容器

时间:2023-10-22 13:46:55浏览次数:42  
标签:11 容器 水槽 状态 res 面积 最多水 短板 指针

1.题目介绍

2.题解(双指针)

参考文章:

作者:Krahets
链接:https://leetcode.cn/problems/container-with-most-water/solutions/11491/container-with-most-water-shuang-zhi-zhen-fa-yi-do/
来源:力扣(LeetCode)

思路

设两指针 \(i,j\) ,指向的水槽板高度分别为 \(h[i]\) ,\(h[j]\) , 此状态下水槽面积为 \(S(i,j)\) 由于可容纳水的高度由两板中的 短板 决定,因此可得如下 面积公式 \(\vdots\)

\[S(i,j)=min(h[i],h[j])\times(j-i) \]

在每个状态下,无论长板或短板向中间收窄一格,都会导致水槽 (底边宽度 -1) 变短:

  • 若向内 移动短板, 水槽的短板 \(min(h[i],h[j])\) 可能变大, 因此下个水槽的面积可能增大。
  • 若向内 移动长板, 水槽的短板 \(min(h[i],h[j])\) 不变或变小,因此下个水槽的面积 一定变小。

明白这一点的同时,双指针的思路也就跃然纸上了,分别在最左段和最右端设置两个双指针,记录下每次运算后最大的水槽面积,之后向内移动短板(移动长板,面积肯定变小,是无用组合,可以舍弃),最后知直到两指针重合。

算法流程:

  1. 初始化: 双指针 \(i,j\) 分列水槽左右两端;
  2. 循环收窄: 直至双指针相遇时跳出;
    a. 更新面积最大值 \(res\) ,
    b.选定两板高度中的短板, 向中间收窄一格;
  3. 返回值: 返回面积最大值 \(res\) 即可;

正确性证明

若暴力枚举, 水槽两板固成面积 \(S(i,j)\) 的状态总数为 \(C(n,2)\) 。

假设状态 \(S(i,j)\) 下 \(h[i]<h[j]\) ,在向内移动短板至 \(S(i+1,j)\) ,则相当于消去了
\(S(i,j-1),S(i,j-2),...,S(i,i+1)\) 状态集合。而所有消去状态的面积一定都小于当前面积(即 \(<S(i,j))\) ,因为这些状态:

  • 短板高度: 相比 \(S(i,j)\) 相同或更短 (即 \(\leq h[i]\) );
  • 底边宽度: 相比 \(S(i,j)\) 更短;

因此,每轮向内移动短板,所有消去的状态都不会导致面积最大值丢失,证毕。

代码

class Solution {
public:
    int maxArea(vector<int>& height) {
        int i = 0, j = height.size() - 1;
        int res = 0;
        while (i < j){
            res = height[i] <= height[j] ? std::max(res, (j - i) * std::min(height[i++], height[j])) : std::max(res, (j - i) * std::min(height[i], height[j--]));
        }
        return res;
    }
};

标签:11,容器,水槽,状态,res,面积,最多水,短板,指针
From: https://www.cnblogs.com/trmbh12/p/17780352.html

相关文章

  • 11_常用类和基础API
    ......
  • Win11配置两个git用户
    背景有两个github账号,一个主要负责公开的内容,一个私人的,需要在同一台电脑上满足代码提交且互不干扰。核心操作分为三步:配置ssh的config文件切换用户关闭全局用户名称(可选)测试环境Win:11OpenSSH:8.6Git:2.39.1.windows.11.配置.ssh文件夹下config文件生成key......
  • laravel:服务容器(10.27.0)
    一,相关文档:https://learnku.com/docs/laravel/10.x/container/14842二,php代码:假设我们有两种商品:虚拟商品如账号,实体商品如手办需要销售1,App\extend\mall\GoodsInterface.php1234567<?phpnamespaceApp\extend\mall;//接口interfaceGoodsInterfa......
  • 20211105李宜时《信息安全系统设计与实现》第六周学习笔记
    Ubuntu学习笔记:Unix/Linux进程管理相关基础知识在Ubuntu学习Unix/Linux进程管理之前,需要了解以下基础知识:进程:进程是正在运行的程序的一个实例。每个进程都有一个唯一的进程标识符(PID)。进程状态:进程可以处于运行、睡眠、停止、僵尸等不同状态。进程调度:操作系统负责安......
  • 1168
    复制代码到粘帖板#include<bits/stdc++.h>#include<string>usingnamespacestd;intmain(){strings1,s2;cin>>s1>>s2;inta[201]={},b[201]={},c[201]={};intlena=s1.size();intlenb=s2.size();for(int......
  • 20211128《信息安全系统设计与实现》第三章学习笔记
    一、任务内容自学教材第10章,提交学习笔记(10分)1.知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容(4分) “我在学***X知识点,请你以苏格拉底的方式对我进行提问,一次一个问题”核心是要求GPT:“请你以苏......
  • 深度学习环境搭建(Windows11)
    深度学习环境的搭建(Windows11)偶然重装了系统,在此记录下环境的恢复基本深度学习环境的搭建,包括Anaconda+CUDA+cuDNN+Pytorch+TensorRT的安装与配置。ps:显卡为RTX4060LaptopGPU1.安装Python前往Python官网https://www.python.org/getit/,下载最新版Python并安装即可。2.......
  • Docker 容器的应用-记录一下
    此次使用环境说明一下,避免掉坑浪费过多时间MacminiM1/MacBookProM2Docker容器 OrbStack安装方式待补充#TODO Dockerlogin登录打包端口 客户端 ......
  • kubernets启动容器过程分析
    1.背景对于大数据组件,经常需要进行扩缩容的服务,例如Yarnnodemanager、AlluxioWorker。往往需要频繁的人工操作上线下线,非常繁琐,耗费较高的人力成本。为了降低这种人工操作的成本,可以考虑将这些服务部署到kubernets中进行管理。本文通过介绍kubernets启动容器的过程,介绍期间经......
  • 2023-2024-1 20211327 信息安全系统设计与实现 学习笔记6(必做)
    学习笔记6Unix/Linux系统多任务处理概述多任务处理系统Unix/Linux系统的进程管理实践过程Unix/Linux系统多任务处理概述1.进程管理:进程是程序的执行实例。Unix和Linux支持多个进程同时运行,每个进程都有自己的独立地址空间和资源。这使得多个应用程序可以同时运行,互不干......