22. 括号生成
思路:回溯法。如果左边括号小于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. 砖墙
思路:穿过的砖头数最少意味着穿过的砖头边缘最多(它们两个的和总为砖墙的高度),所以我们可以求垂线穿过墙边缘最多的数量,用墙的高度减去它即可。
遍历每一行,把每行的各个砖头右边边缘到墙左边缘的距离作为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. 省份数量
思路:广度优先。如果遍历到的城市没被记录过,就添加到队列中,这个队列是记录所有与城市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