首页 > 其他分享 >Leetcode 11 -- 双指针&&贪心

Leetcode 11 -- 双指针&&贪心

时间:2022-10-09 20:48:40浏览次数:87  
标签:11 right 边界 -- 移动 height && left 指针

题目说明

盛水最多的容器
题目要求我们找出两个边界 \(L\) 和 \(R\),使得 容量:\(min(right[L], right[R]) * (R - L)\) 的值最大。

思路

算法不是玄学。
首先,两层 for 循环暴力枚举所有情况肯定是对的。(不要觉得暴力是没用的,很多情况下,只有证明优化过的算法和暴力可以达到同样的效果,才能保证这个算法是正确的)当然,暴力肯定会超时。
我们可以考虑双指针,两个指针一个指向左边界 \(L\),一个指向右边界 \(R\),从这个水桶的外侧往内逐渐压缩。
现在,有一个难题,我们的指针肯定要往内移动,问题是,该如何移动?是两个指针同时往内移动,还是左指针向右移动,还是右指针向左移动?
为了确保答案的正确性,我们要保证移动的过程中不要漏掉最优解。所以在这三种情况中,第一种情况肯定是不行的。那么就剩下移动左指针还是右指针了。
结论:如果一个边界的高度太低,那么此时,它已经得到了它能构成的最大值!
证明:假设左边界的高度小于右边界,我们移动右边界而不是左边界(高度低的一方)
因为我们的指针不能向外移动,所以 \((R-L)\) 的值肯定是随着 \(R\) 向内走而减小的。那么此时左右边界构成的值就由 \(min(height[L], height[R])\) 决定了,又因为这是取最小值,所以这个值是肯定不会增大的。所以说,当左边界的高度小于右边界时,移动右边界,得到的容量绝对不会变大。也就是说其中绝对不会包含比此时更优的解。当左边界的高度大于右边界时同理。于是,我们就可以确保,这样的方案符合暴力得到的解。

代码

class Solution {
public:
    int maxArea(vector<int>& height) {
        int n = height.size();
        
        int left = 0, right = n - 1, f = 1, res = 0;
        while(left < right)
        {
            res = max(res, (right - left) * min(height[left], height[right]));
            if(height[left] < height[right])    left ++ ;
            else    right -- ;
        }
        // 算法不是玄学,我们要考虑,为什么双指针是正确的。
        return res;
    }
};

标签:11,right,边界,--,移动,height,&&,left,指针
From: https://www.cnblogs.com/ALaterStart/p/16773584.html

相关文章

  • 实验3:OpenFlow协议分析实践
    1.搭建下图所示拓扑,完成相关IP配置,并实现主机与主机之间的IP通信。用抓包软件获取控制器与交换机之间的通信数据。2.查看抓包结果,分析OpenFlow协议中交换机与控制器......
  • ABC272 做题笔记
    打得比较漂亮的一场,光速过ABCDE,但是FGH都太过神仙,EX干脆赛时只有两人AC/kkAProblemlink->https://atcoder.jp/contests/abc272/tasks/abc272_a。Solution按题意......
  • 【747】多分类模型metrics计算
    参考:EvaluationMetricsForMulti-classClassification(Micro-,Macro-计算)参考:多分类模型Accuracy,Precision,Recall和F1-score的超级无敌深入探讨参考:二分类和多分......
  • school01
    命令提示符基本指令//切换到需要的路径cd+空格+路径名//切换到e盘e://显示文件dir java在命令提示符运行//编译javac+空格+需要编译的java文件+后缀名//运行j......
  • .Net Framework中的AppDomain.AssemblyResolve事件的常见用法、问题,以及解决办法
    一、简述本文简要的介绍.NETFramework中System.AppDomain.AssemblyResolve事件的用法、使用注意事项,以及复杂场景下AssemblyResolve事件的污染问题和解决办法。......
  • 实现fastdfs防盗链功能
    目录1、背景2、实现原理2.1开启防盗链2.2重启nginx2.3Java代码生成token1、token生成规则2、java生成token3、测试3.1带正确token访问3.2带错误token访问4、项目代码......
  • Oracle转Poatgresql,ora2pg工具安装使用
    一、ora2pg:ora2pg工具可以将oracle的结构转为postgresql格式,可以配置Oracle的模式导出、客户端编码、导出类型、ora2pg中使用的数据类型转换等,最终输出为sql文件,在postgre......
  • 1219. 移动距离
    https://www.acwing.com/problem/content/1221/根据样例,模拟一下得出规律即n/w的值决定n所在的行数是正向还是反向n/2为偶,则为正,为奇,则为反对于一个数,它的位置表示可......
  • 函数
    形式参数在函数定义阶段括号内填写的参数简称'形参'实际参数在函数调用阶段括号内填写的参数简称'实参'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++......
  • 2022年10月9日20:33:18 pycharm vim配置
    自己的配置"================================================================================================"=Extensions==================================......