★ 算法OJ题 ★ 力扣11 - 盛水最多的容器

Ciallo~(∠・ω< )⌒☆ ~ 今天,我将和大家一起做一道双指针算法题--盛水最多的容器~

目录

[一 题目](#一 题目)

[二 算法解析](#二 算法解析)

[三 编写算法](#三 编写算法)


一 题目

11. 盛最多水的容器 - 力扣(LeetCode)

二 算法解析

解法1:暴力枚举

算法思路:双层循环,枚举出能构成的所有容器,找出其中容积最⼤的值。(会超时)

解法2:对撞指针

如题目中的示例1:1 8 6 2 5 4 8 3 7

算法思路:

设两个指针 left , right 分别指向容器的左右两个端点,容器的左边界为 heightleft ,右边界为 heightright 。

如果此时我们固定⼀个边界,改变另⼀个边界 ,假设heightleft < heightright,水的容积:

  • 容器的宽度⼀定变小。
  • 由于左边界较小,决定了水的高度 。如果改变左边界 ,新的水面高度不确定,但是⼀定不会超 过右边的柱⼦高度,因此容器的容积可能会增大。
  • 如果改变右边界 ,无论右边界移动到哪里,新的⽔⾯的⾼度⼀定不会超过左边界,也就是不会 超过现在的水面高度,但是由于容器的宽度减小,因此容器的容积⼀定会变小的。

故左边界和其余边界的组合情况都可以舍去。

循环上述过程 ,每次都可以舍去⼤量不必要的枚举过程,直到 left 与 right 相遇。期间产⽣的所有的容积里面的最大值,就是最终答案。

三 编写算法

cpp 复制代码
class Solution {
public:
    int maxArea(vector<int>& height) {
        int left = 0, right = height.size() - 1;
        int v = 0;
        while(left < right)
        {
            int ret = min(height[left], height[right]) * (right - left);
            v = max(ret, v); // 更新最大面积
            // 哪个小删哪个
            if(height[left] < height[right])
                left++;
            else
                right--;
        }
        return v;
    }
};
相关推荐
梦帮科技5 分钟前
【3.0修订版】音乐权利 NFT:MusicRightsNFT 的确权思想与授权关联
网络协议·算法·web3·区块链·密码学·智能合约·零知识证明
傲世仙尊7 分钟前
C++起步-命名空间解决命名冲突与cin-cout缺省参数
开发语言·c++
hljqwb10 分钟前
java服务异常日志只打印异常类型,没有堆栈定位分析(十)
java·开发语言
Zw-awa13 分钟前
陀螺小车传奇之00011000
c语言·stm32
ym hyd 11114 分钟前
生鲜超市库存管理信息系统源码 Java+SpringBoot+Vue3 前后分离
java·开发语言·vue.js·spring boot·毕设
haerapi16 分钟前
KingbaseES 全文检索实战之前:先建立中文搜索的可解释基线
开发语言·python·全文检索
Dfreedom.16 分钟前
基于PCA的光谱物质识别分析
算法
徐小黑ACG17 分钟前
Golang 基础02 控制语句
开发语言·后端·golang
liyunlong-java22 分钟前
敏感词过滤完整指南(DFA 字典树)
java·开发语言·spring
(Charon)23 分钟前
【C++面试】四种cast转换:static_cast、dynamic_cast、const_cast与reinterpret_cast
开发语言·c++·面试