力扣第 194 场周赛小结

1、数组异或操作

1、题目描述:
在这里插入图片描述
在这里插入图片描述

2、题解:
先求出数组nums,然后按位异或即可。

class Solution:
    def xorOperation(self, n: int, start: int) -> int:
        nums = []
        temp = 0
        for i in range(n):
            temp = start + 2 * i
            nums.append(temp)
        res = 0
        for num in nums:
            res ^= num
        return res

2、保证文件名唯一

1、题目描述:
在这里插入图片描述
在这里插入图片描述

2、题解:
哈希集合,但是最后超时

class Solution:
    def getFolderNames(self, names) :
        #哈希集合
        hashset = set()
        res = []
        for s in names:
            if s not in hashset:
                res.append(s)
                hashset.add(s)
            else:
                i = 1
                while s + "(%d)" % i in hashset:
                    i += 1
                res.append(s + "(%d)" % i)
                hashset.add(s + "(%d)" % i))
        return res

哈希表,通过:

class Solution:
    def getFolderNames(self, names) :
        #哈希集合
        hashset = set()
        hashdict = dict()
        res = []
        for name in names:
            if name not in hashset:
                res.append(name)
                hashset.add(name)
                hashdict[name] = 1
            else:
                i = 1 if name not in hashdict else hashdict[name]
                mask = name + "(%d)"
                while  True:
                    upd = mask % i
                    if upd not in hashset:
                        res.append(upd)
                        hashset.add(upd)
                        hashdict[name] = i + 1
                        break
                    i += 1
        return res

3、避免洪水泛滥

1、题目描述:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、题解:

class Solution:
    def avoidFlood(self, rains: List[int]) -> List[int]:
        mk, n = {}, len(rains)
        nex = [0]*n
        i = n-1
        while i>=0:
            m = rains[i]
            if m in mk:
                nex[i]=mk[m]
            else:
                nex[i]=n+1
            mk[m]=i
            i-=1
        from heapq import heappush, heappop
        heap = []
        i = 0
        res = [0]*n
        st = set()
        while i<n:
            if rains[i]:
                res[i]=-1
                if rains[i] in st: return []
                st.add(rains[i])
                heappush(heap, (nex[i], rains[i]))
            else:
                if heap:
                    nn, ii = heappop(heap)
                    res[i]=ii
                    st.remove(ii)
                else:
                    res[i]=1
            i+=1
        return res

4、找到最小生成树里的关键边和伪关键边

1、题目描述:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2、题解:

class Solution:
    def findCriticalAndPseudoCriticalEdges(self, n: int, edges: List[List[int]]) -> List[List[int]]:
        gid = [0]*(n+1)
        gc = [0]*(n+1)
        def findg(g):
            while gid[g]!=g:
                g=gid[g]
            return g
        ne = sorted([(e[2], e[0], e[1], i) for i,e in enumerate(edges)])
        m = len(edges)
        mk = [0]*m
        for i in range(-1, m):
            for j in range(n):
                gid[j]=j
                gc[j]=1
            c, ww = n, 0
            for k in range(m):
                if k==i: continue
                w, a, b, _ = ne[k]
                ga, gb = findg(a), findg(b)
                if ga==gb: continue
                if gc[ga]>gc[gb]:
                    gid[gb]=ga;
                    gc[ga]+=gc[gb]
                else:
                    gid[ga]=gb
                    gc[gb]+=gc[ga]
                c-=1
                ww += w
            if i==-1: mw=ww
            else:
                if c!=1 or mw!=ww:
                    mk[ne[i][3]] |= 1
        for i in range(m):
            for j in range(n):
                gid[j]=j
                gc[j]=1
            w, a, b, ii = ne[i]
            gid[a]=b
            gc[b]+=gc[a]
            c, ww = n-1, w
            for k in range(m):
                if k==i: continue
                w, a, b, _ = ne[k]
                ga, gb = findg(a), findg(b)
                if ga==gb: continue
                if gc[ga]>gc[gb]:
                    gid[gb]=ga;
                    gc[ga]+=gc[gb]
                else:
                    gid[ga]=gb
                    gc[gb]+=gc[ga]
                c-=1
                ww += w
            if mw==ww:
                mk[ii] |= 2
        r1, r2 = [], []
        for i in range(m):
            if mk[i] & 1: r1.append(i)
            elif mk[i]&2: r2.append(i)
        return [r1,r2]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值