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

2023-10-14 04:20

本文主要是介绍【力扣每日一题】2023.10.13 避免洪水泛滥,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

题目:

示例:

分析:

代码:


题目:

示例:

分析:

给我们一个一维数组,元素为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;}
};

这篇关于【力扣每日一题】2023.10.13 避免洪水泛滥的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/208106

相关文章

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数

如何来避免FOUC

FOUC(Flash of Unstyled Content)是指在网页加载过程中,由于CSS样式加载延迟或加载顺序不当,导致页面出现短暂的无样式内容闪烁现象。为了避免FOUC,可以采取以下几种方法: 1. 优化CSS加载 内联CSS:将关键的CSS样式直接嵌入到HTML文档的<head>部分,这样可以确保在页面渲染之前样式就已经加载和应用。提前引入CSS:将CSS文件放在HTML文档的<he

每日一练7:简写单词(含链接)

1.链接 简写单词_牛客题霸_牛客网 2.题目 3.代码1(错误经验) #include <iostream>#include <string>using namespace std;int main() {string s;string ret;int count = 0;while(cin >> s)for(auto a : s){if(count == 0){if( a <=

两数之和--力扣1

两数之和 题目思路C++代码 题目 思路 根据题目要求,元素不能重复且不需要排序,我们这里使用哈希表unordered_map。注意题目说了只对应一种答案。 所以我们在循环中,使用目标值减去当前循环的nums[i],得到差值,如果我们在map中能够找到这个差值,就说明存在两个整数的和为目标值。 如果没有找到,就将当前循环的nums[i]以及下标i放入map中,以便后续查

【每日刷题】Day113

【每日刷题】Day113 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 🌼文章目录🌼 1. 91. 解码方法 - 力扣(LeetCode) 2. LCR 098. 不同路径 - 力扣(LeetCode) 3. 63. 不同路径 II - 力扣(LeetCode) 1. 91. 解码方法 - 力扣(LeetCode) //思路:动态规划。 cl

力扣第347题 前K个高频元素

前言 记录一下刷题历程 力扣第347题 前K个高频元素 前K个高频元素 原题目: 分析 我们首先使用哈希表来统计数字出现的频率,然后我们使用一个桶排序。我们首先定义一个长度为n+1的数组,对于下图这个示例就是长度为7的数组。为什么需要一个长度为n+1的数组呢?假如说总共有三个数字都为1,那么我们需要把这个1放在数组下标为3的位置,假如说数组长度为n,对于这个例子就是长度为3,那么它的

argodb自定义函数读取hdfs文件的注意点,避免FileSystem已关闭异常

一、问题描述 一位同学反馈,他写的argo存过中调用了一个自定义函数,函数会加载hdfs上的一个文件,但有些节点会报FileSystem closed异常,同时有时任务会成功,有时会失败。 二、问题分析 argodb的计算引擎是基于spark的定制化引擎,对于自定义函数的调用跟hive on spark的是一致的。udf要通过反射生成实例,然后迭代调用evaluate。通过代码分析,udf在

13 transition数组的动画使用

划重点 动画:transitiontransition-group :数组动画数组的 添加 / 删除 豆腐粉丝汤 清淡又健康 <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><me