129-134 这周的题是我后来补的
因为我最近生病 就是深恶痛绝的 颈椎病 背上都是麻的 所以 唉 艰难的人生唉。
129 :根节点到叶节点之和
简单题
前序遍历 往下遍历时 传入当前路径和 记得每层乘10
class Solution: def sumNumbers(self, root: TreeNode) -> int: rel = 0 def preorder(root,num): nonlocal rel if (not root.left) and (not root.right): rel += (root.val + 10*num) if root.left: preorder(root.left,10*num + root.val) if root.right: preorder(root.right,10*num + root.val) preorder(root,0) return rel
130:被围绕的区域
本来早就写对了 结果却 把O全写成了零 醉醉醉
先设计一个访问数组VISITED
方法就是 看四条边上的'O' 从这些O出发访问连着的所有O 把他们访问标记置为1
最后遍历整个表 如果有'O' 没有被访问过 就改成X
m = len(board) n = len(board[0]) visited = [[0]* n for i in range(m)] def dfs(i,j): visited[i][j] = 1 if i >0 and board[i-1][j] == 'O' and not visited[i-1][j]: dfs(i-1,j) if i < m-1 and board[i+1][j] == 'O' and not visited[i+1][j]: dfs(i+1,j) if j >0 and board[i][j-1] == 'O' and not visited[i][j-1]: dfs(i,j-1) if j < n-1 and board[i][j+1]== 'O' and not visited[i][j+1]: dfs(i,j+1) for j in range(n): if board[0][j] == 'O' and not visited[0][j]: dfs(0,j) if board[m-1][j] == 'O' and not visited[m-1][j]: dfs(m-1,j) for i in range(m): if board[i][0] == 'O' and not visited[i][0]: dfs(i,0) if board[i][n-1] == 'O' and not visited[i][n-1]: dfs(i,n-1) for i in range(1,m-1): for j in range(1,n-1): if board[i][j] == 'O' and not visited[i][j]: board[i][j] = 'X' 作者:yizhu-jia 链接:https://leetcode-cn.com/problems/surrounded-regions/solution/0-he-o-sha-sha-fen-bu-qing-chu-by-yizhu-oemoa/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
131:分割回文串
第一题是我自己想的办法哎 我好开心。
首先遍历一次S 做一个回文串列表 palind 这个列表比较复杂
palind[i] 里存放以i开始的回文串
palind[i][0] 里存放以i开始 且全部相同的回文串 比如'SSS' 'SS' 'S'
palind[i][1]里存放以i开始 存在不同字母的回文串 比如 'abba'
存放的不是回文串本身 而是回文串的开始和结束 比如【0,1】表示 s[0]单独一个字母。
如何做回文串列表呢 ?
先做最后一个字母 以他开始的只有一个 s[n-1 : n]
对于其他的字母 先看他是否可以组成相同字母回文串 就是palind[i+1][0]
再看 他与palind[i+1] 里所有的回文串 的后一个字母如果相同 那么他加上那个后面的字母 可以组成新的回文串。注意不要超过结尾
这样到第0位 就得到了上面所述的回文串列表
后面就是简单的回溯了
对于palind[0]中的每一个回文串 如果结尾不是n 就 从那个结尾继续回溯 如果结尾时n 就加入结果
class Solution: def partition(self, s: str) -> List[List[str]]: n = len(s) palind = [[[],[]] for i in range(n)] palind[n-1] = [[[n-1,n]],[]] for i in range(n-2,-1,-1): palind[i][0].append([i,i+1]) for each in palind[i + 1][0]: if s[i] == s[i+1]: palind[i][0].append([i,each[1]]) elif each[1] != n and s[i] == s[each[1]] : palind[i][1] .append([i,each[1]+1]) for each in palind[i+1][1]: if each[1] != n and s[i] == s[each[1]] : palind[i][1] .append([i,each[1]+1]) #操作过后 palind[i] 里就存放了所有以i开头的回文串。 rel = [] def dfs(start,curpath): for each in palind[start][0] + palind[start][1]: curpath.append(s[each[0]:each[1]]) if each[1] != n: dfs(each[1],curpath) else: rel.append(curpath[:]) curpath.pop() dfs(0,[]) return rel 作者:yizhu-jia 链接:https://leetcode-cn.com/problems/palindrome-partitioning/solution/rang-wo-po-you-cheng-jiu-gan-de-yi-dao-t-6efh/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
132 回文串2 化身为CV工程师 不开心
这个题太难了 。
class Solution: def minCut(self, s: str) -> int: n = len(s) g = [[True] * n for _ in range(n)] for i in range(n - 1, -1, -1): for j in range(i + 1, n): g[i][j] = (s[i] == s[j]) and g[i + 1][j - 1] f = [float("inf")] * n for i in range(n): if g[0][i]: f[i] = 0 else: for j in range(i): if g[j + 1][i]: f[i] = min(f[i], f[j] + 1) return f[n - 1] 作者:yizhu-jia 链接:https://leetcode-cn.com/problems/palindrome-partitioning-ii/solution/cla-la-la-la-la-la-wo-shi-c-vgong-cheng-m1ekj/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
133 :克隆图
创建了一大堆的辅助变量
原来这种克隆题只需要建立原来结点和新节点的字典映射就可以了
""" # Definition for a Node. class Node: def __init__(self, val = 0, neighbors = None): self.val = val self.neighbors = neighbors if neighbors is not None else [] """ class Solution: def cloneGraph(self, node: 'Node') -> 'Node': if not node: return node QUEUE = deque() nodedict = {} cnode = [] i = 0 QUEUE.append(node) while QUEUE: curNODE = QUEUE.popleft() newnode = Node(val=curNODE.val) cnode.append(newnode) nodedict[curNODE] = i i+= 1 for each in curNODE.neighbors: if each in nodedict: newnode.neighbors.append(cnode[nodedict[each]]) cnode[nodedict[each]].neighbors.append(newnode) elif each not in QUEUE: QUEUE.append(each) return cnode[0] 作者:yizhu-jia 链接:https://leetcode-cn.com/problems/clone-graph/solution/chuang-jian-liao-yi-da-dui-de-fu-zhu-bia-0l7m/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
134: 加油站问题
思路就是找最大段和嘛
如果油和超过了消费和 说明可以走通 否则不行
可以走通的情况下 不就是求哪一段的和最大嘛 简单题
CURSUM =往后加油-消耗 小于0就从新开始
答案和我思路不太一样 是考虑能不能走通的问题。
class Solution: def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int: if sum(gas) < sum (cost): return -1 n = len(gas) temp = [gas[i] - cost[i] for i in range(n)] cursum = 0 maxsum = -1 curindex = 0 for index in range(2*n): cursum += temp[index%n] if cursum< 0: cursum = 0 curindex = index+1 if cursum > maxsum: maxsum = cursum maxindex = curindex return maxindex 作者:yizhu-jia 链接:https://leetcode-cn.com/problems/gas-station/solution/ahahahahyi-ci-ti-jiao-jiu-guo-liao-kai-x-gzb2/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。