(刷题记录5)盛最多水的容器

news/2024/10/7 18:00:06 标签: 学习, c++, 题目记录, 笔记

盛最多水的容器

  • 题目信息:
  • 题目思路(环境来自力扣OJ的C++):
    • 暴力枚举:
    • 双指针:
      • 移动高度较高的指针
      • 移动高度较低的指针
  • 复杂度:
  • 代码与注释:
    • 暴力枚举:
    • 双指针:

题目信息:

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

返回容器可以储存的最大水量

说明:你不能倾斜容器。

题目参考:力扣:11. 盛最多水的容器

题目思路(环境来自力扣OJ的C++):

暴力枚举:

先固定一个数,枚举其与后面的数组成的容器的容量,标记最大的返回。

双指针:

双指针是在暴力枚举的基础上进行优化的。

我们发现:

  1. 容量的大小公式为 底(宽) × 高,使用 对撞指针 移动时,底一定会减小。

  2. 如果移动 高度较高的指针,底(减小) × 高(减小),结果一定比原来的容量小,可以优化这步。

  3. 如果移动 高度较低的指针,底(减小) × 高(减小或增大),这时结果是不确定的,需要遍历。

  4. 对撞指针移动时,并不会出现回退的情况,也就是指针移动规则具有单调性,则双指针的使用有效。

这也就是说,双指针优化掉部分不需要的遍历,降低了时间复杂度。

移动高度较高的指针

移动高度较高的指针

移动高度较低的指针

移动高度较低的指针

复杂度:

暴力枚举:
时间复杂度:(n × n)
空间复杂度:(1)

双指针:
时间复杂度:(n)
空间复杂度:(1)

代码与注释:

暴力枚举:

class Solution {
public:
    int maxArea(vector<int>& height) {          // 暴力会超时 O(n ^ 2)
        int ret = 0;
        int sz = height.size();
        for (int i = 0; i < sz; ++i)            // 先固定一个数
        {
            for (int j = sz - 1; j > i; --j)    // 分别计算其与后面的数
            {                                   // 组成的容器的容量
                int wide = j - i;
                int high = min(height[i], height[j]);
                ret = max(ret, wide * high);    // 标记最大的
            }
        }
        return ret;                             // 返回
    }
};

双指针:

class Solution {
public:
    int maxArea(vector<int>& height) {          // 对撞指针 O(n)
        int left = 0;
        int right = height.size() - 1;
        int ret = 0;
        while (left < right)                    // 对撞则遍历完
        {
            int wide = right - left;
            int high = min(height[left], height[right]);
            ret = max(ret, wide * high);        // 标记最大的

            if (height[left] < height[right])   // 移动高度较低的指针
            {
                ++left;
            }
            else
            {
                --right;
            }
        }
        return ret;
    }
};

http://www.niftyadmin.cn/n/5693154.html

相关文章

C++ : STL容器之string剖析

STL容器之string剖析 一、string 的迭代器&#xff08;一&#xff09;起始迭代器&#xff08;二&#xff09;末尾迭代器&#xff08;三&#xff09;反向迭代器 二、容量相关的函数&#xff08;一&#xff09;size&#xff08;二&#xff09;capacity&#xff08;三&#xff09;…

QT-多线程、线程池的使用

在进行桌面应用程序开发的时候&#xff0c; 假设应用程序在某些情况下需要处理比较复杂的逻辑&#xff0c;如果只有一个线程去处理&#xff0c;就会导致窗口卡顿&#xff0c;无法处理用户的相关操作。这种情况下就需要使用多线程&#xff0c;其中一个线程处理窗口事件&#xff…

单细胞组学大模型(6)--- LangCell,医学/细胞文本知识增强模型效果

–https://arxiv.org/abs/2405.06708 代码开源&#xff1a;https://github.com/PharMolix/OpenBioMed LangCell: Language-Cell Pre-training for Cell Identity Understanding 留意更多内容&#xff0c;欢迎关注微信公众号&#xff1a;组学之心 研究团队和研究单位 聂再清…

大数据新视界 --大数据大厂之 Alluxio 数据缓存系统在大数据中的应用与配置

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

服务无法启动

有个服务死活无法启动了&#xff0c;运行就直接退出&#xff0c;无任何日志。 调试程序&#xff0c;能进入main函数&#xff0c;能进入SpringApplication.run 说明底层无误。 各种折腾无果。 最终既然没有日志&#xff0c;应该是日志出了问题&#xff0c;问开发是否改配置&a…

Rust-枚举

Rust-枚举 本文介绍 Rust 枚举&#xff08;enumerations&#xff09;&#xff0c;也被称作 enums。 枚举允许你通过列举可能的 成员&#xff08;variants&#xff09; 来定义一个类型。 首先&#xff0c;我们会定义并使用一个枚举来展示它是如何连同数据一起编码信息的。接下…

基于深度学习的视频中的姿态跟踪

基于深度学习的视频姿态跟踪是一项用于从视频序列中持续检测和跟踪人体姿态的技术。它能够识别人体的2D或3D关键点&#xff0c;并在时间维度上进行跟踪&#xff0c;主要应用于人机交互、体育分析、动作识别和虚拟现实等领域。以下是视频姿态跟踪的主要原理和方法&#xff1a; …

开源跨平台三维模型轻量化软件osgGISPlugins-2、如何编译

上一篇&#xff1a;开源跨平台三维模型轻量化软件osgGISPlugins-1、简介 1、编译前的准备&#xff1a;安装、配置vcpkg包管理器 1&#xff09;安装及国内镜像替换教程(Windows和Linux环境都有):vcpkg国内镜像源替换 2&#xff09;下载第三方依赖库(Readme文档中所给出的百度网…