继续恢复做双周赛哈,感觉第100周的难度很低
难度系数:0
知识点:模拟
复杂度:O ( n 2 ) O(n^2) O ( n 2 )
1 2 3 4 5 6 7 8 9 from typing import List from itertools import accumulateclass Solution : def findColumnWidth (self, grid: List [List [int ]] ) -> List [int ]: n = len (grid) line = len (grid[0 ]) return [max (len (str (grid[j][i])) for j in range (n)) for i in range (line)]
知识点:模拟
复杂度:O ( n ) O(n) O ( n )
1 2 3 4 5 6 7 8 9 10 11 from typing import List from itertools import accumulateclass Solution : def findPrefixScore (self, nums: List [int ] ) -> List [int ]: n = len (nums) mx = nums[0 ] for i in range (n): mx = max (nums[i], mx) nums[i] += mx return list (accumulate(nums))
知识点:深度搜索
复杂度:O ( 2 ∗ n ) = O ( n ) O(2*n) = O(n) O ( 2 ∗ n ) = O ( n )
思路:
先进行第一次搜索:用mark标记出兄弟节点的size,同时按照深度缓存下所有相同深度节点的权重之和
然后进行第二次搜索:使用缓存出的权重之和减去当前节点的权重,同时减去兄弟节点的size,最后得到题目要求的权重
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 from typing import Optional class TreeNode : def __init__ (self, val=0 , left=None , right=None ): self.val = val self.left = left self.right = rightclass Solution : def replaceValueInTree (self, root: Optional [TreeNode] ) -> Optional [TreeNode]: dep_mp = [0 ] * (10 **5 ) root.mark = 0 def dfs (rt: TreeNode, dep: int ): dep_mp[dep] += rt.val if rt.left: rt.left.mark = 0 if rt.right: rt.right.mark = 0 if rt.left and rt.right: rt.left.mark = rt.right.val rt.right.mark = rt.left.val if rt.left: dfs(rt.left,dep+1 ) if rt.right: dfs(rt.right,dep+1 ) def dfs1 (rt: TreeNode, dep: int ): rt.val = dep_mp[dep] - rt.val - rt.mark if rt.left: dfs1(rt.left,dep+1 ) if rt.right: dfs1(rt.right,dep+1 ) dfs(root,0 ) dfs1(root,0 ) return root
知识点:dijkstra
复杂度:O ( q ∗ n 2 ) O(q * n^2) O ( q ∗ n 2 )
思路:
建图时边表转换矩阵
查询时使用dijkstra进行查询
优化:
这题简单的不像第四题,单纯的dijkstra应用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 from typing import List INF = 100086111111 class Graph : def dijkstra (self, start: int ): n = len (self.matrix) dist = [INF] * n dist[start] = 0 visited = [False ] * n for i in range (n): min_dist = INF min_index = -1 for j in range (n): if not visited[j] and dist[j] < min_dist: min_dist = dist[j] min_index = j if min_index == -1 : break visited[min_index] = True for j in range (n): if not visited[j] and self.matrix[min_index][j] != INF: dist[j] = min (dist[j], dist[min_index] + self.matrix[min_index][j]) return dist def __init__ (self, n: int , edges: List [List [int ]] ): self.matrix = [([INF] * n)for i in range (n)] for i in range (n): self.matrix[i][i] = 0 for start, end, weight in edges: self.matrix[start][end] = weight self.now_version = 0 def addEdge (self, edge: List [int ] ) -> None : self.now_version += 1 for start, end, weight in [edge]: self.matrix[start][end] = weight def shortestPath (self, node1: int , node2: int ) -> int : res = self.dijkstra(node1)[node2] if res >= INF: return -1 return res