90-94 到二叉树了 不是很会写这个数据结构
90题 子集2 我想起了上次写子集1 仿照那个写法 结果还不错
根据上题大佬解法有感
如果nums有n个数字 那么就分n轮进行 第i轮就只看nums[i]
每一轮,对于rel中的每一个结果 让这个结果添加一个nums[i] 再添加到结果中去。
如 [1,2,3]这个nums 第0轮 rel是[[]] 对于这个[] 添加nums[0] 加入结果得到rel = [[],[1]]
第1轮 rel有两个结果 都添加一个nums[1] 再加入rel 得到这轮结果[[],[1],[2],[1,2]]
第二轮再都添一个3 得到最后的8个元素的结果。
但是这道题有重复数字 如何避免重复 也很容易做到。
首先我们将列表排序
如果nums中 一个数字和前一轮的相同 那么他只需要在前一轮得到的结果上添加自己,而不是在所有的rel中添加自己
因为上一个数已经再前面所有结果上添加过了
举例 [1,2,2]
开始 rel = [[]]
0轮: rel = [[],[1]]
1轮: rel = [[],[1],[2],[1,2]]
在第二轮时我们发现 如果再对于rel中的[],[1]中添加2 就会得到重复的结果 [2] [1,2]
那么 怎么做 我们就仅仅对上一轮时添加的新结果[2],[1,2]添加nums[2]即可,这样得到不重复的[2,2],[1,2,2]。 前面的就不需要添加了 。
所以这里引入leni 记录 新添加结果的长度 如果第i轮数和前面的不同 leni 就是整个rel
如果相同 leni就还是上一组的长度,只需要将rel 后面leni个添加当前轮元素即可。
class Solution: def subsetsWithDup(self, nums: List[int]) -> List[List[int]]: nums = sorted(nums) n = len(nums) rel = [[]] leni = 1 for i in range(n): if nums[i] != nums[i-1]: leni = len(rel) for each in rel[:leni]: rel.append(each+[nums[i]]) else: lenrel = len(rel) for each in rel[-leni:lenrel]: rel.append(each+[nums[i]]) return rel 作者:yizhu-jia 链接:https://leetcode-cn.com/problems/subsets-ii/solution/fei-hui-su-du-te-de-si-lu-zao-jiu-du-te-neyxp/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
91:
无语凝噎泪潸然竟然还要看答案
class Solution: def numDecodings(self, s: str) -> int: n = len(s) dp = [0] * (n+1) if s[0] == '0': return 0 dp[0] = 1 dp[1] = 1 for i in range(1,n): if s[i] != '0': dp[i+1] += dp[i] if s[i-1] != '0' and int(s[i-1:i+1])<=26: dp[i+1] += dp[i-1] return dp[n] 作者:yizhu-jia 链接:https://leetcode-cn.com/problems/decode-ways/solution/wu-yu-ning-ye-lei-shan-ran-by-yizhu-jia-i1cx/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
92 :
今天真是不应该,又被大部分击败
# Definition for singly-linked list. # class ListNode: # def __init__(self, val=0, next=None): # self.val = val # self.next = next class Solution: def reverseBetween(self, head: ListNode, left: int, right: int) -> ListNode: headnode = ListNode(0,head) p = headnode while left > 1: #找到左结点的前一个结点。 left -= 1 right -= 1 p = p.next r = p.next if r == None: return head q = r.next while right > 1: right -=1 r.next = q.next q.next = p.next p.next = q q = r.next return headnode.next 作者:yizhu-jia 链接:https://leetcode-cn.com/problems/reverse-linked-list-ii/solution/jin-tian-zhen-shi-bu-ying-gai-you-bei-da-4icd/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
93
不错不错不错 真不错 今天回溯真不错
把判断提出来感觉好很多
len(s) <= 3*(4-len(path)):
这一句可是一个大剪枝
class Solution: def restoreIpAddresses(self, s: str) -> List[str]: def isvalid(s1): if s1 == '': return False if int(s1)>255: return False if s1=='0': return True if s1[0] == '0': return False return True def dfs(s,path): if len(path) == 3: if isvalid(s): path.append(s) rel.append(path[:]) path.pop() elif len(s) <= 3*(4-len(path)): if isvalid(s[:1]): path.append(s[:1]) dfs(s[1:],path) path.pop() if len(s) > 2 and isvalid(s[:2]): path.append(s[:2]) dfs(s[2:],path) path.pop() if len(s) > 2 and isvalid(s[:3]): path.append(s[:3]) dfs(s[3:],path) path.pop() global rel rel = [] if len(s) > 12 or len(s) < 4: return [] dfs(s,[]) for i,each in enumerate(rel): rel[i] = '.'.join(each) return rel 作者:yizhu-jia 链接:https://leetcode-cn.com/problems/restore-ip-addresses/solution/bu-cuo-bu-cuo-bu-cuo-zhen-bu-cuo-jin-tia-9yh8/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
94 :中序遍历
递归真好写 我都不想写非递归了
# Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right class Solution: def inorderTraversal(self, root: TreeNode) -> List[int]: rel = [] def mintra(node): if node!= None: if node.left != None: mintra(node.left) rel.append(node.val) if node.right!= None: mintra(node.right) mintra(root) return rel 作者:yizhu-jia 链接:https://leetcode-cn.com/problems/binary-tree-inorder-traversal/solution/di-gui-zhen-hao-xie-wo-du-bu-xiang-xie-f-5mb5/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。