LeetCode刷题|22. 括号生成, 554. 砖墙,547. 省份数量

本文介绍了使用回溯法解决LeetCode中的括号生成问题,以及如何利用广度优先搜索算法解决554.砖墙问题(计算最少需要移动砖块次数)和547.省份数量问题(找出城市间联通省份的数量)。
摘要由CSDN通过智能技术生成

22. 括号生成

题目链接:22. 括号生成 - 力扣(LeetCode)

思路回溯法。如果左边括号小于n,可以加上“(", 进入递归。如果左括号小于右括号,可以加上右括号,进入递归,当总括号数达到2n时,加入到结果集中。

代码

class Solution(object):
    def generateParenthesis(self, n):
        return self.backtracking([], n, 0, 0, [])

    def backtrack ing(self, s, n, left, right, ans):
        if len(s) == 2*n:
            ans.append(''.join(s))
            return
        if left < n:
            s.append('(')
            self.backtracking(s, n, left + 1, right, ans)
            s.pop()
        if right < left:
            s.append(')')
            self.backtracking(s, n, left, right + 1, ans)
            s.pop()
        return ans
        
        

554. 砖墙

题目链接:554. 砖墙 - 力扣(LeetCode)

思路:穿过的砖头数最少意味着穿过的砖头边缘最多(它们两个的和总为砖墙的高度),所以我们可以求垂线穿过墙边缘最多的数量,用墙的高度减去它即可。

遍历每一行,把每行的各个砖头右边边缘到墙左边缘的距离作为key记录在哈希表中,value是每个距离的数量。最后找到数量最大的value就是垂线可以穿过的最多边缘数量。不能沿着墙的两个垂直边缘之一画线,所以不考虑每一行最后一块砖头。但这样如果每一行只有一块砖头,那么哈希表就为空,这是应该单独返回答案,即砖墙的高度/每个砖块的高度,因为垂线只能从所有砖块中穿过。

代码

class Solution(object):
    def leastBricks(self, wall):
        record = dict()   # key: value  砖块右侧到砖墙左边缘的距离:距离个数
        for j in range(len(wall)):
            value = 0
            for i in range(len(wall[j]) - 1):
                value += wall[j][i]
                if value not in record:
                    record[value] = 1
                else:
                    record[value] = record.get(value) + 1
        return len(wall) - max(record.values()) if record else len(wall)
                

547. 省份数量

链接:547. 省份数量 - 力扣(LeetCode)

思路:广度优先。如果遍历到的城市没被记录过,就添加到队列中,这个队列是记录所有与城市i直接或间接联通的容器。当队列不为空,就弹出队列中的城市,找和弹出城市相通的城市,如果之前没被记录过,就添加到队列中。如果队列为空了,说明没有和当前城市直接或间接相通的城市了,至此包含此城市的省已经”建立“完毕,省份数加1。

代码

class Solution(object):
    def findCircleNum(self, isConnected):
        record =set()
        num = 0
        n = len(isConnected)
        for i in range(n):
            if i not in record:
                Q = collections.deque([i])
                while Q:
                    j = Q.popleft()
                    record.add(j)
                    for k in range(n):
                        if isConnected[j][k] == 1 and k not in record:
                            Q.append(k)
                num += 1   # Q空了,说明没有与i之间或者间接联通的城市了
        return num

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值