【每日一题Day346】LC1488避免洪水泛滥 | 贪心+哈希表

简介: 【每日一题Day346】LC1488避免洪水泛滥 | 贪心+哈希表

避免洪水泛滥【LC1488】

你的国家有无数个湖泊,所有湖泊一开始都是空的。当第 n 个湖泊下雨前是空的,那么它就会装满水。如果第 n 个湖泊下雨前是 满的 ,这个湖泊会发生 洪水 。你的目标是避免任意一个湖泊发生洪水。

给你一个整数数组 rains ,其中:

rains[i] > 0 表示第 i 天时,第 rains[i] 个湖泊会下雨。

rains[i] == 0 表示第 i 天没有湖泊会下雨,你可以选择 一个 湖泊并 抽干 这个湖泊的水。

请返回一个数组 ans ,满足:

ans.length == rains.length

如果 rains[i] > 0 ,那么ans[i] == -1 。

如果 rains[i] == 0 ,ans[i] 是你第 i 天选择抽干的湖泊。

如果有多种可行解,请返回它们中的 任意一个 。如果没办法阻止洪水,请返回一个 空的数组 。

请注意,如果你选择抽干一个装满水的湖泊,它会变成一个空的湖泊。但如果你选择抽干一个空的湖泊,那么将无事发生。

思路:贪心+哈希表

  • 当如果某个湖泊在第i天和第j天会下雨,那么需要在没有湖泊下雨的第k天将该湖泊抽干,k ∈ ( i , j ) 贪心:为了避免其他湖泊发生湖水、即不影响将其他湖泊抽干,我们应该选择第一个大于i的索引作为k;

     如果没有合法的k,则证明没办法阻止洪水,返回一个 空的数组 。

  • 根据以上思路,我们需要以下数据结构实现
  • 哈希表:key为湖泊编号,value为湖泊在第几天下雨
  • TreeSet:记录哪天不下雨,可以抽干某个湖泊的水;使用API搜索大于给定元素的最小元素并删除给元素
  • 实现
class Solution {
    public int[] avoidFlood(int[] rains) {
        int n = rains.length;
        int[] ans = new int[n];
        Arrays.fill(ans, -1);
        TreeSet<Integer> days = new TreeSet<>();// 记录哪天可以抽干某个湖泊的水
        Map<Integer, Integer> fullPools = new HashMap<>();// key为湖泊编号,value为湖泊在第几天下雨
        for (int i = 0; i < n; i++){
            if (rains[i] == 0){
                days.add(i);
                ans[i] = 1;// 任意抽干一个湖泊
            }else if (fullPools.containsKey(rains[i])){
                // 湖泊已满,需要在fullPools.get(rains[i])之后抽干该湖泊
                Integer j = days.higher(fullPools.get(rains[i]));//返回此set中大于给定元素的最小元素,如果没有这样的元素,则返回NULL。
                if (j == null){
                    return new int[0];
                }else{
                    ans[j] = rains[i];
                    days.remove(j);
                    fullPools.put(rains[i], i);
                }           
            }else{
                fullPools.put(rains[i], i);
            }
        }
        return ans;
    }
}

复杂度

时间复杂度:O ( n l o g n )

空间复杂度:O ( n )

目录
相关文章
|
存储 SQL Linux
MinIO客户端安装教程(Window版)
MinIO客户端安装教程(Window版)
1776 0
|
Docker 容器
docker swarm 移除 Worker 节点
【10月更文挑战第12天】
212 5
|
9月前
|
运维 Shell 数据库
Python执行Shell命令并获取结果:深入解析与实战
通过以上内容,开发者可以在实际项目中灵活应用Python执行Shell命令,实现各种自动化任务,提高开发和运维效率。
268 20
|
关系型数据库 分布式数据库 数据库
2024年全国大学生计算机系统能力大赛PolarDB数据库创新设计赛(天池杯)等你来战!
2024年全国大学生计算机系统能力大赛PolarDB数据库创新设计赛(天池杯)等你来战!
724 15
2024年全国大学生计算机系统能力大赛PolarDB数据库创新设计赛(天池杯)等你来战!
|
SQL 安全 测试技术
Burpsuite Decoder解码功能实战
Burpsuite Decoder解码功能实战
|
计算机视觉
【YOLOv8改进 - 特征融合NECK】 HS-FPN :用于处理多尺度特征融合的网络结构,降低参数
MFDS-DETR是针对白细胞检测的创新方法,它通过HS-FPN和可变形自注意力解决规模差异和特征稀缺问题。HS-FPN利用通道注意力模块增强特征表达,改善多尺度挑战。代码和数据集可在给定链接获取。此方法在WBCDD、LISC和BCCD数据集上表现优越,证明了其有效性和通用性。YOLO系列文章提供了更多目标检测改进和实战案例。
|
Java
深入理解 Java 8 函数式接口:定义、用法与示例详解
深入理解 Java 8 函数式接口:定义、用法与示例详解
697 2
|
算法 安全 Linux
Ctfshow web入门 PHP特性篇 web89-web151 全(二)
Ctfshow web入门 PHP特性篇 web89-web151 全(二)
382 0
|
SQL 存储 关系型数据库
【Hive】Hive有哪些方式保存元数据,各有哪些特点?
【4月更文挑战第17天】【Hive】Hive有哪些方式保存元数据,各有哪些特点?
|
SQL 数据库 数据安全/隐私保护
[极客大挑战 2019]LoveSQL1 题目分析与详解
[极客大挑战 2019]LoveSQL1 题目分析与详解
1127 0