22. 括号生成 数字 n 代表生成括号的对数,请你设计一个函数, 用于能够生成所有可能的并且 有效的 括号组合。 示例 1: 输入:n = 3 输出:["((()))","(()())","(())()","()(())","()()()"] 示例 2: 输入:n = 1 输出:["()"]
题解:采用暴力解法,直接生成所有结果的结构树(其实为满二叉树),dfs遍历所有节点
# 生成所有情况
class Solution:
def generateParenthesis(self, n: int) :
if n <= 0: return []
res = []
def dfs(paths):
if len(paths) == n * 2: # 因为括号都是成对出现的
res.append(paths)
return
dfs(paths + '(')
dfs(paths + ')')
dfs('')
return res
输出的结果如下 ['((((', '((()', '(()(', '(())', '()((', '()()', '())(', '()))', ')(((', ')(()', ')()(', ')())', '))((', '))()', ')))(', '))))'] 我们发现有一些结果是我们不需要的,比如((((,比如)))) 观察不需要的括号特点, ((((实际上已经超过n了,我们生成同一方向的括号只需要n个即可, 在生成的时候我们要限制住左括号与右括号生成的数量 这时我增加了left与right参数,分别代表左括号与右括号的数量, 每生成一个我就增加一个。 那结束DFS的条件首先就需要把不符合的给过滤掉, ( > n 或 ) > n 或 ) > ( 当然 ) > n 这个条件也可以没有,因为 ) > ( 条件已经给控制住了。
# dfs 解法
class Solution:
def generateParenthesis(self, n: int) -> List[str]:
if n <= 0: return []
res = []
def dfs(paths, left, right):
if left > n or right > left: return
if len(paths) == n * 2: # 因为括号都是成对出现的
res.append(paths)
return
dfs(paths + '(', left + 1, right) # 生成一个就加一个
dfs(paths + ')', left, right + 1)
dfs('', 0, 0)
return res
21 合并有序链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
题解:创建一个新的链表add,并使用dummy节点来保存新链表的头节点。 在while循环中,代码会比较list1和list2的当前节点的值, 将较小的节点添加到新链表的末尾,并将对应的链表向前移动一位。 然后,add节点也向前移动一位,以便于添加下一个节点。 当list1或list2其中一个链表遍历完后,while循环就会结束。 此时,另一个链表可能还有剩余的节点,这些节点都比新链表的所有节点的值要大, 所以可以直接将它们添加到新链表的末尾。 最后,代码返回dummy.next,即新链表的头节点。注意,dummy节点本身是一个哑节点, 不包含在最终的链表中。
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution(object):
def mergeTwoLists(self, list1, list2):
"""
:type list1: Optional[ListNode]
:type list2: Optional[ListNode]
:rtype: Optional[ListNode]
"""
add=dummy=ListNode(0)
while list1 and list2:
# 选择较小的,(升序输出)
if list1.val<list2.val:
add.next=list1
list1=list1.next
else:
add.next=list2
list2=list2.next
add=add.next
add.next=list1 or list2
return dummy.next