【力扣每日一题】2023.10.13 避免洪水泛滥

news2025/2/21 21:59:17

目录

题目:

示例:

分析:

代码:


题目:

示例:

分析:

给我们一个一维数组,元素为0表示对应日期不下雨,非0则表示对应日期对应号的湖泊下雨,下雨之后会导致该湖泊满水,如果湖泊满水之后还下雨,那么就会导致洪水。如果不下雨我们就可以选择一个湖泊抽水,抽水之后对应湖泊就空了。同时,所有湖泊一开始都是空的。

要我们返回一个一维数组,第i个元素表示第i天我们抽取的湖泊号数,如果那天下雨,那么我们无法抽水,给答案置-1。要我们避免发生洪水,可以返回任意抽水方案。

如果我们无论怎么抽水都会导致洪水,那么返回空数组。

我们需要保证在某湖泊下雨之前,这个湖泊是空的,也就是说除非这个湖泊是第一次下雨,否则我们需要在下雨之前把这个湖泊给抽了。

我们能抽水的时候只能是没有下雨的时候,所以没下雨的时候我们就要选择抽哪个湖泊的水了,这该如何选择呢?我们要抽的湖泊是下一个下雨且已经满了的湖泊,也就是这个湖泊已经下过雨了,并且下一个下雨的还是这个湖泊,这样就可以避免洪水了。

所以我们需要记录下过雨的湖泊,使用set或是map都可以很方便地查询某号湖泊是否下过雨,具体选择哪种容器我们接着再分析。

假设我们不知道下一次下雨的是哪个湖泊,那么我们就在没下雨的日期放个“时光机器”,也就是把没下雨的日期记录下来,这次抽水的机会我们先不抽水,等下下次下雨的时候我再“穿越”回合适的日期把这个湖泊的水抽掉。

存放这个“时光机器”也就是索引的容器,我们可以使用vector。

如果某个湖泊下雨了,并且之前下过雨,我们需要“穿越”回去抽水了,现在从存放“时光机器”的容器里我们选择合适的日期穿越回去,最合适的日期就是这个湖泊第一次下雨之后的第一个没雨的日期,我们就挑选出比该湖泊第一次下雨的日期更大的第一个日期,由此可见,我们不仅要存储下雨的湖泊,还需要记录该湖泊下雨时的日期,所以回到刚刚的容器选择问题,存放下过雨的湖泊的容器我们选择map,键值就是下雨的日期。

现在已经分析完毕,我们把之前的分析结果串连起来。

我们用下标遍历题目给出的数组,如果元素为0表示不下雨,我们就把当前下标存入vector中。

如果元素不为0表示有湖泊不下雨,我们就开始操作,如果是第一次下雨我们就将湖泊的号数连同下标(也就是日期)存放进map中,如果不是第一次下雨,那就意味着我们需要“穿越”回去把这个湖泊的水抽走了。

由于我们是按顺序存放日期的,所以我们可以直接遍历vector,找到第一个大于这个湖泊第一次下雨日期的日期,然后将对应日期的答案修改为这个湖泊的号数。如果我们遍历完全部的vector都找不到合适的日期,那么就表明我们无法做到不发生洪水,这时返回空数组即可。

同时不要忘记收尾工作,我们“穿越”回去把湖泊第一次下的雨给抽走了,那么就相当于湖泊下的第二场雨变成了“第一次下的雨”,所以我们还需要更新湖泊下雨的日期,以及把使用过的“时光机器”从容器中移除。

最后返回结果即可。

代码:

class Solution {
public:
    vector<int> avoidFlood(vector<int>& rains) {
        int n=rains.size();
        vector<int>res(n,1);                //默认抽取1号
        vector<int> flag;                   //存储可以抽水的日期
        unordered_map<int,int>m;            //存放湖泊装满水的日期
        for(int i=0;i<n;i++){
            if(rains[i]==0) flag.push_back(i); //如果没下雨,那么可以抽水,记录日期   
            else{
                if(m.find(rains[i])==m.end()) m[rains[i]]=i;    //如果湖泊第一次下雨,记录日期
                else{
                    auto index=flag.begin();            
                    //找到比湖泊装满水的日期之后的第一个可以抽水的日期
                    for(;index!=flag.end();++index){
                        if((*index)>m[rains[i]]){
                            //找到了就回到那天去抽这个湖泊
                            res[(*index)]=rains[i];
                            break;
                        }
                    }
                    //如果找不到,那么发生洪水
                    if(index==flag.end()) return {};
                    //移除这个可以抽水的日期
                    flag.erase(index);
                    //更新装满水的日期
                    m[rains[i]]=i;
                }
                res[i]=-1;
            }
        }
        return res;
    }
};

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

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

相关文章

01-10 周二 PyCharm远程Linux服务器配置进行端点调试

01-10 周二 PyCharm远程Linux服务器配置 时间版本修改人描述2023年1月10日14:04:15V0.1宋全恒新建文档2023年2月6日11:03:45V0.2宋全恒添加快捷指令别名的实现方便虚拟环境的切换 简介 使用 PyCharm&#xff0c;您可以使用位于另一台计算机(服务器)上的解释器调试应用程序。 …

HotSpot的算法实现

1.根节点的枚举 我们通过可达性分析算法从GC Roots中找到全局性的引用&#xff08;例如常量或者类静态属性&#xff09;或者是执行上下文&#xff08;例如栈帧中的本地变量&#xff09;中&#xff0c;尽管我们的目标非常明确&#xff0c;但是随着java的不断扩大&#xff0c;光一…

JTS: 12 Descriptions 图形覆盖

这里写目录标题 版本代码Intersection 交集Union 并集Difference 差集SymDifference 补集 版本 org.locationtech.jts:jts-core:1.19.0 链接: github 代码 /*** 图形覆盖操作* author LiHan* 2023年10月12日 19:34:09*/ public class GeometryDescriptions {private final Ge…

抽象类

一、认识抽象类 public abstract class A {//类该有的成员&#xff0c;抽象类都有private String name;public static String schoolName;public A() {}//抽象方法&#xff1a;必须有abstract修饰 只有方法签名&#xff0c;没有方法体public abstract void run();} //一个类继…

Kafka SASL认证授权(六)全方位性能测试

Kafka SASL认证授权(六)全方位性能测试。 官网地址:https://kafka.apache.org/ 一、场景 线上已经有kafka集群,服务运行稳定。但是因为产品升级,需要对kakfa做安全测试,也就是权限验证。 但是增加权限验证,会不会对性能有影响呢?影响大吗?不知道呀! 因此,本文就此…

机器学习网络模型绘图模板

一 前言 本期为读者推荐一款名为ML Visuals的机器学习画图PPT模板&#xff0c;ML Visuals 专为解决神经网络画图问题设计&#xff0c;通过提供免费的专业的、科学的和充分的视觉和图形来帮助机器学习社区改善科学传播。目前&#xff0c;ML Visuals 包含了超过100多个的自定义图…

Python接口自动化 —— token登录(详解)

简介 为了验证用户登录情况以及减轻服务器的压力&#xff0c;减少频繁的查询数据库&#xff0c;使服务器更加健壮。有些登录不是用 cookie 来验证的&#xff0c;是用 token 参数来判断是否登录。token 传参有两种一种是放在请求头里&#xff0c;本质上是跟 cookie 是一样的&am…

人大与加拿大女王大学金融硕士——带你了解GMAT考试为何如此重要

随着社会经济的发展&#xff0c;金融行业的优势愈发明显。越来越多的人想要进入金融行业发展&#xff0c;但学历往往成为了敲门砖。自人大与加拿大女王大学金融硕士项目创办以来&#xff0c;受到了许多学子及在职人士的欢迎&#xff0c;但想要报考人大加拿大女王大学金融硕士项…

一文讲清楚webpack和vite原理

一、前言 每次用vite创建项目秒建好&#xff0c;用vue-cli创建了一个项目&#xff0c;却有点久&#xff0c;那为什么用 vite 比 webpack 要快呢&#xff0c;这篇文章带你梳理清楚它们的原理及不同之处&#xff01;文章有一点长&#xff0c;看完绝对有收获&#xff01; 目录&a…

nginx之location的优先级和nginx的重定向

一、nginx之location的优先级和匹配方式&#xff08;重点&#xff09; &#xff08;一&#xff09;nginx的正则表达式 nginx的正则表达式 符号 含义 ^ 字符串的起始位置&#xff08;以什么开头&#xff09; $ 字符串的结束位置&#xff08;以什么结尾&#xff09; * 匹…

漏洞复现(CVE-2023-35843)

免责声明&#xff1a; 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直…

Nginx正向代理配置(http)

前言 在工作中我们经常使用nginx进行反向代理,今天介绍下怎么进行正向代理,支持http请求,暂不支持https 首先先介绍下正向代理和反向代理。 正向代理 在客户端&#xff08;浏览器&#xff09;配置代理服务器&#xff0c;通过代理服务器进行互联网访问。 反向代理 客户端只…

字符串匹配——KMP算法

目录 KMP&#xff08;Knuth Morris Pratt&#xff09; KMP算法复杂度分析 字符串匹配中除了简单的BF&#xff08;Brute Force&#xff09;、RK&#xff08;Rabin-Karp&#xff09;算法&#xff0c;还有更高效、较难理解的 BM&#xff08;Boyer-Moore&#xff09;和KMP&#…

Android之根据时区获取当前时间

文章目录 前言偶尔我们也会做多个国家的APP&#xff0c;难免少不了时间显示&#xff0c;所以我们就需要获取当前时区的当前时间&#xff0c;几句代码解决、 一、效果图二、实现步骤1.TimeUtil2.调用 总结 前言 偶尔我们也会做多个国家的APP&#xff0c;难免少不了时间显示&…

从公司搭建的gitlab代码仓拉取代码失败问题

从gitlab代码仓拉取代码失败问题解决 1.问题描述2.分析解决3.解决问题 1.问题描述 1.在访问到从公司搭建的gitlab代码仓后&#xff0c;选择了要拉取的地址&#xff0c;使用git拉取代码时&#xff0c;拉取失败&#xff0c;报错如下 2.分析解决 1.因为网页可以看到代码仓中这…

yolov7模型训练环境安装

ANACONDA Free Download | Anacondahttps://www.anaconda.com/download/进入ANACONDA安装的盘后输入python测试环境是否安装完成 进入 cd Scripts后 在同路径下下载&#xff0c;pip install opencv-python cd.. 退回上层 python 打开’ import cv2 cv2.__version__…

Redis学习1

NOSql型数据库 NoSQL&#xff08;Not Only SQL&#xff09;是一种数据库管理系统的范畴&#xff0c;它不使用传统的关系型数据库管理系统&#xff08;RDBMS&#xff09;模型。相对于传统的关系型数据库&#xff0c;NoSQL 数据库在数据存储和检索方面提供了更多的灵活性和可伸缩…

B端企业为什么需要软文推广?媒介盒子告诉你

在传统的营销概念中&#xff0c;大部分人认为B端企业不需要品牌曝光&#xff0c;企业只需要靠质量与服务就能获得稳定客源&#xff0c;而在互联网加速发展的今天&#xff0c;B端企业的营销方式也发生变化&#xff0c;有不少B端企业来找媒介盒子进行软文推广&#xff0c;接下来媒…

Git遇到问题收集

您的企业已过期或者超过配额&#xff0c;请升级或续订&#xff01; 如何解决&#xff1a; 此问题是企业仓库满额导致&#xff0c;联系公司的gitee管理人员进行处理

c++图像处理-----自适应阈值操作:`cv::adaptiveThreshold()`

自适应阈值操作&#xff1a;cv::adaptiveThreshold() cv::adaptiveThreshold()是OpenCV库中的一个函数&#xff0c;用于图像处理中的自适应阈值二值化操作。这个函数通常用于将灰度图像转换为二值图像&#xff0c;其中每个像素的阈值是根据其周围邻域的像素值自动确定的&#…