Leetcode 双周赛 33

在这里插入图片描述
直接模拟 没啥问题

class Solution:
    def thousandSeparator(self, n: int) -> str:
        if not n:
            return '0'
        ans=''
        i=0
        while n :
            ans=str(n%10)+ans
            i+=1
            if i%3==0:
                ans='.'+ans
            n//=10
        return ans if ans[0]!='.' else ans[1:]

在这里插入图片描述
拓扑排序 所求的点集就是入度为0的点集

class Solution:
    def findSmallestSetOfVertices(self, n: int, edges: List[List[int]]) -> List[int]:
        glyph=collections.defaultdict(set)
        cnt=[0 for _ in range(n)]
        for a,b in edges:
            cnt[b]+=1
            glyph[a].add(b)
        
        res=[i for i in range(n) if cnt[i]==0]
        return res

在这里插入图片描述
注意到乘二是全体乘,加一只能给一个元素加
那么所求最少就是(每个元素加一操作之和)+(全体元素中乘二次数最多的)
变为如何通过操作得到n
由于 n ≥ 2 n\geq 2 n2时, n / 2 ≥ 1 n/2\geq1 n/21,所以求操作数时应先除以二而不是减去1

class Solution:
    def minOperations(self, nums: List[int]) -> int:
        ans1=0
        ans2=0
        memo={}
        def getcnt(ni):
            ans1=0
            ans2=0
            while ni:
                if ni&1:
                    ni-=1
                    ans1+=1
                else:
                    ni//=2
                    ans2+=1
            return ans1,ans2
        
        for ni in nums:
            cnt1,cnt2=getcnt(ni)
            ans1+=cnt1
            ans2=max(ans2,cnt2)
        
        return ans1+ans2

在这里插入图片描述
广搜即可 注释见代码

class Solution:
    def containsCycle(self, grid: List[List[str]]) -> bool:
        m = len(grid)
        n = len(grid[0])
        used = [[0]*n for _ in range(m)]
        for i in range(m):
            for j in range(n):
                if used[i][j] == 0:
                    alpha = grid[i][j] 
                    cur = None
                    nxt = {(i, j)}
                    '''
                    当前正在搜索的目标字符
                    当前正在搜索的集合
                    下一步要搜索的集合
                    '''
                    while nxt:
                        cur = nxt
                        nxt = set()
                        for node in cur:
                            row, col = node
                            used[row][col] = 1
                            if row+1 < m and grid[row+1][col] == alpha and used[row+1][col] == 0:
                                neighbor = (row+1, col)
                                if neighbor in cur or neighbor in nxt:
                                    return True
                                else:
                                    nxt.add(neighbor)
                            if row-1 >= 0 and grid[row-1][col] == alpha and used[row-1][col] == 0:
                                neighbor = (row-1, col)
                                if neighbor in cur or neighbor in nxt:
                                    return True
                                else:
                                    nxt.add(neighbor)
                            if col+1 < n and grid[row][col+1] == alpha and used[row][col+1] == 0:
                                neighbor = (row, col+1)
                                if neighbor in cur or neighbor in nxt:
                                    return True
                                else:
                                    nxt.add(neighbor)
                            if col-1 >= 0 and grid[row][col-1] == alpha and used[row][col-1] == 0:
                                neighbor = (row, col-1)
                                if neighbor in cur or neighbor in nxt:
                                    return True
                                else:
                                    nxt.add(neighbor)
        return False

在这里插入图片描述
标号为搜索顺序

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值