【周赛总结】第194场周赛——保证文件名唯一,洪水泛滥,最小生成树

未参加的比赛,感觉leetcode的比赛确实越来越难了

第二题 保证文件名唯一

在这里插入图片描述

一道有意思的题目,要求对相同名字的文件添加序号。
我们需要考虑减小复杂度,也就是每次遇到重复的文件名时候,需要维护一个字典去存储该文件名已经命名到了哪个序列。

class Solution:
    def getFolderNames(self, names: List[str]) -> List[str]:
        if not names:
            return []
         # 存储每个文件名字,对应的序号
        dic = collections.defaultdict(int)
        has = set()
        ans = []
        for i in names:
        	# 不是新的文件名
            if i in has:
                k = dic[i]
                cur = i+"("+ str(k)+')'
                while cur in has:
                    k += 1
                    cur = i+"("+ str(k)+')'
                dic[i] = k
             # 是新的文件名
            else:
                cur = i
            # 每次都会产生一个新的文件名族,和添加新的文件
            dic[cur] = 1
            ans.append(cur)
            has.add(cur)
        return ans

第三题 避免洪水泛滥

在这里插入图片描述

也是一道合理设计结构的题目,有一点类似贪心的思路。比较巧妙之处在于理解题意,题目给出了要求,不让洪水泛滥,因此我们在每天抽干时候,可以选择最紧急的一个。

因此我们要找到每个湖泊对应的下一天下雨的时间,这里采用倒叙遍历的方法,用字典每次更新下每个湖泊下雨的日子,数组存储了当天的湖泊,在哪一天赢来下一次下雨
之后我们借助一个最小堆,每次遇到不下雨的时候,从最小堆中选取最紧急的抽水即可。

class Solution:
    def avoidFlood(self, rains: List[int]) -> List[int]:
        has = set()
        ans = []
        n = len(rains)
        next = [n+1]*n
        cur = {}
        search = []
        heapq.heapify(search)
        for i in range(n-1,-1,-1):
            if rains[i]:
                if rains[i] in cur:
                    next[i] = cur[rains[i]]
                cur[rains[i]] = i          
        print(next)
        for i in range(n):
            if rains[i] != 0:
                if rains[i] in has:
                    return []
                ans.append(-1)
                heapq.heappush(search, (next[i], rains[i]))
                has.add(rains[i])
            else:
                if search:
                    _, cur = heapq.heappop(search)
                    ans.append(cur)
                    has.remove(cur)
                else:
                    ans.append(1)

        return ans
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值