盛水最多的容器 + 接雨水(相向双指针)

news2024/11/15 10:01:26

目录

一、盛水最多的容器

二、 接雨水

2.1 - 前后缀分解

2.2 - 相向双指针



一、盛水最多的容器

题目描述

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

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

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

说明:你不能倾斜容器。

示例 1

 

输入:[1,8,6,2,5,4,8,3,7]
输出:49 
解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。 

示例 2

输入:height = [1,1]
输出:1 

提示

  • n == height.length

  • 2 <= n <= 10^5

  • 0 <= height[i] <= 10^4

代码实现

int maxArea(int* height, int heightSize)
{
    int max = 0;
    int left = 0;
    int right = heightSize - 1;
    while(left < right)
    {
        int l = right - left;
        int h = height[left] < height[right] ? height[left++] : height[right--];
        int area =l * h;
        max = area > max ? area : max;
    }    
    return max;
}

分析: 

二、 接雨水

题目描述

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出:6
解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。  

示例 2

输入:height = [4,2,0,3,2,5]
输出:9 

提示

  • n == height.length

  • 1 <= n <= 2 * 10^4

  • 0 <= height[i] <= 10^5

2.1 - 前后缀分解

int trap(int* height, int heightSize) 
{
    int* pre_max = (int*)malloc(sizeof(int) * heightSize);
    int* suf_max = (int*)malloc(sizeof(int) * heightSize);
    pre_max[0] = height[0];
    for (int i = 1; i < heightSize; i++)
    {
        if (height[i] > pre_max[i - 1])
            pre_max[i] = height[i];
        else
            pre_max[i] = pre_max[i - 1];
    }
    suf_max[heightSize - 1] = height[heightSize - 1];
    for (int i = heightSize - 2; i >= 0; i--)
    {
        if (height[i] > suf_max[i + 1])
            suf_max[i] = height[i];
        else
            suf_max[i] = suf_max[i + 1];
    }
    int sum = 0;
    for (int i = 0; i < heightSize; i++)
    {
        int h = (pre_max[i] < suf_max[i] ? pre_max[i] : suf_max[i]) - height[i];
        sum += h * 1;
    }
    free(pre_max);
    free(suf_max);
    return sum;
}

分析

如果能求出每个宽度为 1 的柱子上所接的雨水,那么将所有的水量相加就能得到结果。

pre_max[i] 表示 height[0] ~ height[i] 中最高的柱子;suf_max[i] 表示 height[i] ~ height[heightSize - 1] 中最高的柱子。

i 根的柱子上所接的雨水则为:min(pre_max[i], suf_max[i]) - height[i]

2.2 - 相向双指针

int trap(int* height, int heightSize)
{
    int sum = 0;
    int left = 0, right = heightSize - 1;
    int pre_max = 0, suf_max = 0;
    while (left <= right)
    {
        pre_max = height[left] > pre_max ? height[left] : pre_max;
        suf_max = height[right] > suf_max ? height[right] : suf_max;
        if (pre_max < suf_max)
        {
            sum += pre_max - height[left];
            left++;
        }
        else
        {
            sum += suf_max - height[right];
            right--;
        }
    }
    return sum;
}

分析

pre_max 表示 height[0] ~ height[left] 中最高的柱子;suf_max 表示 height[right] ~ height[heightSize - 1] 中最高的柱子。

  1. 如果 pre_max < suf_max,第 left 根柱子上所借雨水的高度就由 pre_max 决定,因为 suf_max[left] 一定大于 pre_max

  2. 如果 suf_max < pre_max,则第 right 根柱子上所借雨水的高度就由 suf_max 决定,因为 pre_max[right] 一定大于 suf_max

相较于前后缀分解,使用相向双指针求解,时间复杂度依然是 O(n),而空间复杂度则变成了 O(1)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/138617.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

BPM结合低代码,为企业信息化建设添砖加瓦

编者按&#xff1a;业务流程管理和低代码平台结合的意义是什么&#xff1f;能为用户带来什么&#xff1f;本文了分析了低代码平台和BPM结合的意义&#xff0c;并进一步介绍了低代码BPM软件开发平台的应用场景。关键词&#xff1a;嵌入式流程激活&#xff0c;端到端流程打通&…

【ES6】模块化语法(默认、按需导入import导出export的操作)

&#x1f973;博 主&#xff1a;初映CY的前说(前端领域) &#x1f31e;个人信条&#xff1a;想要变成得到&#xff0c;中间还有做到&#xff01; &#x1f918;本文核心&#xff1a;ES6模块化语法(默认、按需导入导出的操作) 本文速览&#xff1a; 目录 本文速览&#x…

Word图片自动编号,调整图片顺序自动更新图片编号,引用该图片的地方也对应更新

Word图片自动编号&#xff0c;调整图片顺序自动更新图片编号&#xff0c;引用该图片的地方也对应更新1.软件环境⚙️2.问题描述&#x1f50d;3.解决方法&#x1f421;3.1.为图片添加题注&#xff0c;实现图片自动编号3.2.设置编号格式&#xff08;可选&#xff09;3.3.在文中引…

参数服务器的参数设置

#! /usr/bin/env python #condingutf-8 import rospy if __name__ __main__: #初始化节点 rospy.init_node(param_set) #新增参数 rospy.set_param(type_p,xiaohuangche) rospy.set_param(radius_p,0.15) #修改参数 rospy.set_param(radius_p,0.2…

我的【二哈喇子!】周岁生日

文章目录回看CSDN的2022新年新Flag回看CSDN的2022 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 各位朋友大家好&#xff0c;我是二哈喇子&#xff01;谢谢你现在在阅读这篇文章。 二零二二年一月二十一日&#xff0c;我的小二哈"出生"了&#x…

2022年报表开发工具Stimulsoft产品迭代汇总

Stimulsoft Reports是一款报告编写器&#xff0c;主要用于在桌面和Web上从头开始创建任何复杂的报告。可以在大多数平台上轻松实现部署&#xff0c;如ASP.NET, WinForms, .NET Core, JavaScript, WPF, Angular, Blazor, PHP, Java等&#xff0c;在你的应用程序中嵌入报告设计器…

AC7811-BLDC无感控制代码详解

BLDC控制框图 BLDC 的控制电路对电机转子位置信号进行逻辑变换后产生脉宽调制 PWM 信号&#xff0c;驱动逆变器的功率开关管&#xff0c;从而控制 BLDC 电机各相绕组按一定顺序工作&#xff0c;在电机气隙中产生跳跃式旋转磁场。BLDC 转子旋转时&#xff0c;每转过 60&#xf…

云游戏三重门:体验、生态和硬件

配图来自Canva可画 如今硬件已经成为制约游戏体验的最主要因素之一。而云游戏的提出&#xff0c;则被看做是解决这种矛盾的其中一种重要手段。对于玩家来说&#xff0c;云游戏意味着既不再需要价格高昂的硬件设备&#xff0c;也不再需要体量庞大的游戏本体&#xff0c;就能获得…

ssd重装系统的详细教程

当我们给电脑更换安装了新的固态硬盘&#xff0c;原来的系统没有了。那么电脑新固态ssd怎么安装win7系统&#xff0c;下面小编就教下大家ssd重装系统教程&#xff0c;希望大家都可以学会哦。 工具/原料&#xff1a; 系统版本&#xff1a;Windows7 品牌型号&#xff1a;惠普星…

PDF怎么转换成excel免费?快收藏这几个方法

在我们日常处理的的工作文件中&#xff0c;PDF文件的数量是越来越高的&#xff0c;而且因为PDF文件比较方便观看&#xff0c;所以很多数据文件也都是PDF格式的&#xff0c;不过PDF文件是不可编辑的&#xff0c;所以在一定程度上还是有限制的&#xff0c;这样我们就不能及时修改…

数据的存储(2)大小端字节序存储

TIPS 1. 2. 3. *是解应用操作符&#xff0c;*指针变量&#xff0c;对指针变量进行解应用操作&#xff0c;固然没问题。但是要知道的是&#xff1a;也可以直接对最最原始的地址进行解应用操作&#xff0c;如*字符串常量&#xff0c;*数组名&#xff0c;*&a等等&#…

云开发项目如何管理资产下的设备?

在开发 SaaS 应用前&#xff0c;开发者需要先在 涂鸦 IoT 开发平台 上创建云开发项目并进行必要的配置。下面我将为大家介绍管理资产的详细操作方法。 云开发支持以资产为维度&#xff0c;对不同资产下的设备进行权限分隔和资产内设备的统一管理。 新建资产 资产&#xff08…

dpdk-lvs的一次线上故障排查报告

背景 我们内部基于 dpdk 自研的高性能负载均衡器 dpdk-lvs 已经在多个机房部署上线&#xff0c;运行正常&#xff0c;但近期有多个金融相关的业务反馈&#xff0c;服务数据包在经过dpdk-lvs转发后&#xff0c;会出现hang住的情况。 问题 1、dpdk-lvs 已经在多个机房上线&…

服务搭建篇(五) Redis单机/redis-cluster集群搭建

一. Redis集群简介 redis集群是一个由多个主从节点群组成的分布式服务器群&#xff0c;它具有复制、高可用和分片特性。Redis集群不需要sentinel哨兵也能完成节点移除和故障转移的功能。需要将每个节点设置成集群模式&#xff0c;这种集群模式没有中心节点&#xff0c;可水平扩…

C语言重点解剖指针和数组要点速记

1.指针指向的是最低字节地址。 2.每一次跑程序&#xff0c;变量的地址都会是随机的&#xff0c;这是一种保护机制。基本上不可以使用地址直接访问变量。 3.以下是一段有意思的代码。 4.在栈上开辟变量&#xff0c;地址由高到低变化&#xff0c;值得注意的是&#xff0c;不是连…

云原生|kubernetes|kube-bench安全检测工具的部署和使用

前言&#xff1a; 安全是一个绕不开的话题&#xff0c;那么&#xff0c;在云原生领域&#xff0c;在kubernetes内更加的需要安全。毕竟没有人愿意自己的项目是千疮百孔&#xff0c;适当的安全可以保证项目或者平台稳定高效的运行。 安全性是一个永远不会消失的问题&#xff0c…

基于springboot+mybatis+mysql+vue软件缺陷管理系统

基于springbootmybatismysqlvue软件缺陷管理系统一、系统介绍二、功能展示1.主页2.个人中心3.缺陷管理4.项目管理5.系统管理6.统计分析三、代码展示四、其它1.其他系统实现2.获取源码一、系统介绍 系统主要功能&#xff1a; 开发人员&#xff1a;主页、个人中心&#xff08;我…

Java记录2:Java的三种注释类型

Java 注释 文章目录Java 注释一、单行注释 //二、多行注释 /*三、文档注释用于注解说明解释程序的文字就是注释&#xff0c;注释提高了代码的阅读性&#xff08;可读性&#xff09;。   注释是一个程序员必须要具有的良好编程习惯。将自己的思想通过注释先整理出来&#xff0…

EasyExcel写数字格式数据默认为科学计数法解决方案

问题背景 我们项目有个场景是excel下载&#xff0c;需要将数字类型的数据由字符格式转化为数字格式&#xff0c;但由于数字较长&#xff0c;利用easyExcel写入文件后&#xff0c;数字类型会默认展示为科学计数法。下面我们来看看demo演示。 demo演示 准备以下代码 public c…

2015-2022机器人方向课程教学评价成绩和任务汇总

←机器人工程或机器人方向毕业设计汇总篇→↓2022↑https://zhangrelay.blog.csdn.net/article/details/124856849ROS机器人程序设计课程反思-2022终篇-https://blog.csdn.net/ZhangRelay/article/details/127295957由于系统更新&#xff0c;分为两个部分2015-20182018-2022学生…