10
10
11
11
> 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 ` char[] ` 的形式给出。
12
12
13
- ``` go
14
- func reverseString (s []byte ) {
15
- res := make ([]byte , 0 )
16
- reverse (s, 0 , &res)
17
- for i := 0 ; i < len (s); i++ {
18
- s[i] = res[i]
19
- }
20
- }
21
- func reverse (s []byte , i int , res *[]byte ) {
22
- if i == len (s) {
23
- return
24
- }
25
- reverse (s, i+1 , res)
26
- *res = append (*res, s[i])
27
- }
13
+ ``` Python
14
+ class Solution :
15
+ def reverseString (self , s : List[str ]) -> None :
16
+ """
17
+ Do not return anything, modify s in-place instead.
18
+ """
19
+ def rev_rec (s , i , j ):
20
+ if i >= j:
21
+ return
22
+ s[i], s[j] = s[j], s[i]
23
+ rev_rec(s, i + 1 , j - 1 )
24
+ return
25
+
26
+ rev_rec(s, 0 , len (s) - 1 )
27
+
28
+ return
28
29
```
29
30
30
31
[ swap-nodes-in-pairs] ( https://leetcode-cn.com/problems/swap-nodes-in-pairs/ )
31
32
32
33
> 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
33
34
> ** 你不能只是单纯的改变节点内部的值** ,而是需要实际的进行节点交换。
34
35
35
- ``` go
36
- func swapPairs (head *ListNode ) *ListNode {
37
- // 思路:将链表翻转转化为一个子问题,然后通过递归方式依次解决
38
- // 先翻转两个,然后将后面的节点继续这样翻转,然后将这些翻转后的节点连接起来
39
- return helper (head)
40
- }
41
- func helper (head *ListNode )*ListNode {
42
- if head==nil ||head.Next ==nil {
36
+ ``` Python
37
+ class Solution :
38
+ def swapPairs (self , head : ListNode) -> ListNode:
39
+
40
+ if head is not None and head.next is not None :
41
+ head_next_pair = self .swapPairs(head.next.next)
42
+ p = head.next
43
+ head.next = head_next_pair
44
+ p.next = head
45
+ head = p
46
+
43
47
return head
44
- }
45
- // 保存下一阶段的头指针
46
- nextHead := head.Next .Next
47
- // 翻转当前阶段指针
48
- next := head.Next
49
- next.Next =head
50
- head.Next =helper (nextHead)
51
- return next
52
- }
53
48
```
54
49
55
50
[ unique-binary-search-trees-ii] ( https://leetcode-cn.com/problems/unique-binary-search-trees-ii/ )
56
51
57
52
> 给定一个整数 n,生成所有由 1 ... n 为节点所组成的二叉搜索树。
58
53
59
- ``` go
60
- func generateTrees (n int ) []*TreeNode {
61
- if n==0 {
62
- return nil
63
- }
64
- return generate (1 ,n)
65
-
66
- }
67
- func generate (start ,end int )[]*TreeNode {
68
- if start>end{
69
- return []*TreeNode{nil }
70
- }
71
- ans := make ([]*TreeNode,0 )
72
- for i := start;i<=end;i++{
73
- // 递归生成所有左右子树
74
- lefts := generate (start,i-1 )
75
- rights := generate (i+1 ,end)
76
- // 拼接左右子树后返回
77
- for j := 0 ;j<len (lefts);j++{
78
- for k := 0 ;k<len (rights);k++{
79
- root := &TreeNode{Val:i}
80
- root.Left =lefts[j]
81
- root.Right =rights[k]
82
- ans=append (ans,root)
83
- }
84
- }
85
- }
86
- return ans
87
- }
54
+ 注意:此题用来训练递归思维有理论意义,但是实际上算法返回的树并不是 deep copy,多个树之间会共享子树。
55
+
56
+ ``` Python
57
+ class Solution :
58
+ def generateTrees (self , n : int ) -> List[TreeNode]:
59
+
60
+ def generateTrees_rec (i , j ):
61
+
62
+ if i > j:
63
+ return [None ]
64
+
65
+ result = []
66
+ for m in range (i, j + 1 ):
67
+ left = generateTrees_rec(i, m - 1 )
68
+ right = generateTrees_rec(m + 1 , j)
69
+
70
+ for l in left:
71
+ for r in right:
72
+ result.append(TreeNode(m, l, r))
73
+
74
+ return result
75
+
76
+ return generateTrees_rec(1 , n) if n > 0 else []
88
77
```
89
78
90
79
## 递归+备忘录
@@ -96,24 +85,20 @@ func generate(start,end int)[]*TreeNode{
96
85
> F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
97
86
> 给定 N,计算 F(N)。
98
87
99
- ``` go
100
- func fib (N int ) int {
101
- return dfs (N)
102
- }
103
- var m map [int ]int =make (map [int ]int )
104
- func dfs (n int )int {
105
- if n < 2 {
106
- return n
107
- }
108
- // 读取缓存
109
- if m[n]!=0 {
110
- return m[n]
111
- }
112
- ans := dfs (n-2 )+dfs (n-1 )
113
- // 缓存已经计算过的值
114
- m[n]=ans
115
- return ans
116
- }
88
+ ``` Python
89
+ class Solution :
90
+ def fib (self , N : int ) -> int :
91
+
92
+ mem = [- 1 ] * (N + 2 )
93
+
94
+ mem[0 ], mem[1 ] = 0 , 1
95
+
96
+ def fib_rec (n ):
97
+ if mem[n] == - 1 :
98
+ mem[n] = fib_rec(n - 1 ) + fib_rec(n - 2 )
99
+ return mem[n]
100
+
101
+ return fib_rec(N)
117
102
```
118
103
119
104
## 练习
@@ -122,3 +107,4 @@ func dfs(n int)int{
122
107
- [ ] [ swap-nodes-in-pairs] ( https://leetcode-cn.com/problems/swap-nodes-in-pairs/ )
123
108
- [ ] [ unique-binary-search-trees-ii] ( https://leetcode-cn.com/problems/unique-binary-search-trees-ii/ )
124
109
- [ ] [ fibonacci-number] ( https://leetcode-cn.com/problems/fibonacci-number/ )
110
+
0 commit comments