摸鱼刷题||记录下没做对的题目

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

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

1、rains[i] > 0 表示第 i 天时,第 rains[i] 个湖泊会下雨。
2、rains[i] == 0 表示第 i 天没有湖泊会下雨,你可以选择 一个 湖泊并抽干这个湖泊的水。
请返回一个数组 ans ,满足:
1、ans.length == rains.length
2、如果 rains[i] > 0 ,那么ans[i] == -1 。
3、如果rains[i] == 0 ,ans[i] 是你第 i 天选择抽干的湖泊。 如果有多种可行解,请返回它们中的任意一个 。如果没办法阻止洪水,请返回一个空的数组 。
请注意,如果你选择抽干一个装满水的湖泊,它会变成一个空的湖泊。但如果你选择抽干一个空的湖泊,那么将无事发生。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/avoid-flood-in-the-city
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

第一反应是从前往后或者从后往前遍历,建立队列存储晴天的日子,遇到装满水的湖泊要下雨的情况,就从队列头部pop一个日子,如果队列为空则返回空集。
显然这个解法对如下情况无效:

{1,0,2,2}

百思不得其解,看了题解区的二分查找方法,豁然开朗,二分查找赛高!
依然是遍历的方法,使用unordered_map记录湖泊上次下雨的日子,使用到set记录晴天的日子(而不是队列),对于装满水的湖泊要下雨的情况,在set二分查找搜索到最接近上次下雨日子j的晴天i,显然i>j,找不到则返回空集,找到则更新unordered_map和set;对于空的湖泊要下雨的情况,只需要更新unordered_map。代码如下:

	vector<int> avoidFlood(vector<int>& rains) {
        int n=rains.size();
        unordered_map<int,int> m;
        vector<int> ans(n,1);
        set<int> s;
        for(int i=0;i<n;i++){
        	//晴天
            if(rains[i]==0){
                s.insert(i);//存储晴天
                continue;
            }
            //下雨
            if(m.count(rains[i])!=0){//湖泊装满的情况
                auto it=s.lower_bound(m[rains[i]]);//二分查找
                if(it==s.end()) return {};//找不到则返回空集
                ans[*it]=rains[i];
                s.erase(it);
            }
            ans[i]=-1;
            m[rains[i]]=i;
        }
        return ans;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值