Skip to content

Commit 023fc50

Browse files
committed
regular leetcode
1 parent c063b74 commit 023fc50

7 files changed

+369
-0
lines changed
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
###17. Letter Combinations of a Phone Number
2+
3+
题目:
4+
5+
<https://leetcode.com/problems/letter-combinations-of-a-phone-number/>
6+
7+
8+
难度:
9+
10+
Medium
11+
12+
13+
14+
15+
```
16+
class Solution(object):
17+
def letterCombinations(self, digits):
18+
"""
19+
:type digits: str
20+
:rtype: List[str]
21+
"""
22+
if digits == "":
23+
return []
24+
25+
self.res = []
26+
self.singleResult('',digits)
27+
return self.res
28+
29+
def singleResult(self, s, digits):
30+
if len(digits) == 0:
31+
self.res.append(s)
32+
else:
33+
mapx = {'2':['a','b','c'],
34+
'3':['d','e','f'],
35+
'4':['g','h','i'],
36+
'5':['j','k','l'],
37+
'6':['m','n','o'],
38+
'7':['p','q','r','s'],
39+
'8':['t','u','v'],
40+
'9':['w','x','y','z']}
41+
42+
curDigit = digits[0]
43+
for alpha in mapx[curDigit]:
44+
self.singleResult(s + alpha, digits[1:])
45+
46+
47+
```
48+
49+

022._generate_parentheses.md

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
###22. Generate Parentheses
2+
3+
题目:
4+
<https://leetcode.com/problems/generate-parentheses/>
5+
6+
7+
难度:
8+
9+
Medium
10+
11+
12+
13+
14+
15+
```
16+
class Solution(object):
17+
def generateParenthesis(self,n):
18+
"""
19+
:type n: int
20+
:rtype: List[str]
21+
"""
22+
self.res = []
23+
self.singleStr('', 0, 0, n)
24+
return self.res
25+
26+
def singleStr(self, s, left, right, n):
27+
if left == n and right == n:
28+
self.res.append(s)
29+
if left < n:
30+
self.singleStr(s + '(',left + 1, right,n)
31+
if right < left:
32+
self.singleStr(s + ')',left, right + 1, n)
33+
34+
```
35+
36+
37+
非常牛逼的讲解,需要这样的人来给我们讲算法
38+
39+
####以Generate Parentheses为例,backtrack的题到底该怎么去思考?
40+
41+
42+
所谓Backtracking都是这样的思路:在当前局面下,你有若干种选择。那么尝试每一种选择。如果已经发现某种选择肯定不行(因为违反了某些限定条件),就返回;如果某种选择试到最后发现是正确解,就将其加入解集
43+
44+
所以你思考递归题时,只要明确三点就行:选择 (Options),限制 (Restraints),结束条件 (Termination)。即“ORT原则”(这个是我自己编的)
45+
46+
47+
48+
49+
对于这道题,在任何时刻,你都有两种选择:
50+
1. 加左括号。
51+
2. 加右括号。
52+
53+
同时有以下限制:
54+
1. 如果左括号已经用完了,则不能再加左括号了。
55+
2. 如果已经出现的右括号和左括号一样多,则不能再加右括号了。因为那样的话新加入的右括号一定无法匹配。
56+
57+
结束条件是:
58+
左右括号都已经用完。
59+
60+
结束后的正确性:
61+
左右括号用完以后,一定是正确解。因为1. 左右括号一样多,2. 每个右括号都一定有与之配对的左括号。因此一旦结束就可以加入解集(有时也可能出现结束以后不一定是正确解的情况,这时要多一步判断)。
62+
63+
递归函数传入参数:
64+
限制和结束条件中有“用完”和“一样多”字样,因此你需要知道左右括号的数目。
65+
当然你还需要知道当前局面sublist和解集res。
66+
67+
因此,把上面的思路拼起来就是代码:
68+
69+
if (左右括号都已用完) {
70+
加入解集,返回
71+
}
72+
//否则开始试各种选择
73+
if (还有左括号可以用) {
74+
加一个左括号,继续递归
75+
}
76+
if (右括号小于左括号) {
77+
加一个右括号,继续递归
78+
}
79+
80+
81+
82+
你帖的那段代码逻辑中加了一条限制:“3. 是否还有右括号剩余。如有才加右括号”。这是合理的。不过对于这道题,如果满足限制1、2时,3一定自动满足,所以可以不判断3。
83+
84+
这题其实是最好的backtracking初学练习之一,因为ORT三者都非常简单明显。你不妨按上述思路再梳理一遍,还有问题的话再说。
85+
86+
87+
88+
以上文字来自 1point3arces的牛人解答

039._combination_sum.md

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
###39. Combination Sum
2+
3+
题目:
4+
5+
<https://leetcode.com/problems/combination-sum/>
6+
7+
8+
难度:
9+
10+
Medium
11+
12+
13+
最初的思路:
14+
15+
16+
```
17+
res = []
18+
def combSum(candidates, target, valueList):
19+
if target == 0:
20+
res.append(valueList)
21+
for candidate in candidates:
22+
if candidate > target:
23+
return
24+
combSum(candidates, target - candidate, valueList + [candidate] )
25+
26+
```
27+
28+
29+
问题在于,有重复:
30+
31+
```
32+
combSum([2,3,6,7],7,[])
33+
34+
res
35+
Out[9]: [[2, 2, 3], [2, 3, 2], [3, 2, 2], [7]]
36+
```
37+
38+
然后看了hint,除[2, 2, 3][2, 3, 2]这种重复的方式是, 把candidates先sort,然后用index的方式来处理。
39+
40+
41+
所以最终的除重大法如下,根据hint做出:
42+
43+
```
44+
class Solution(object):
45+
def combinationSum(self, candidates, target):
46+
"""
47+
:type candidates: List[int]
48+
:type target: int
49+
:rtype: List[List[int]]
50+
"""
51+
candidates = list(set(candidates))
52+
candidates.sort()
53+
self.res = []
54+
self.combSum(candidates, target, 0, [])
55+
return self.res
56+
57+
58+
def combSum(self, candidates, target, start, valueList):
59+
length = len(candidates)
60+
if target == 0:
61+
self.res.append(valueList)
62+
for i in range(start, length):
63+
if target < candidates[i]:
64+
return
65+
self.combSum(candidates, target - candidates[i], i, valueList + [candidates[i]])
66+
```

040._combination_sum_ii.md

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
###40. Combination Sum II
2+
3+
题目:
4+
5+
<https://leetcode.com/problems/combination-sum-ii/>
6+
7+
8+
难度:
9+
10+
Medium
11+
12+
13+
Combination Sum 已经AC,做了minor change.
14+
15+
```
16+
class Solution(object):
17+
def combinationSum2(self, candidates, target):
18+
"""
19+
:type candidates: List[int]
20+
:type target: int
21+
:rtype: List[List[int]]
22+
"""
23+
candidates.sort()
24+
self.res = []
25+
self.combSum(candidates, target, 0, [])
26+
return self.res
27+
28+
def combSum(self, candidates, target, start, valueList):
29+
length = len(candidates)
30+
if target == 0:
31+
if valueList not in self.res:
32+
self.res.append(valueList)
33+
if length == 0:
34+
return
35+
for i in range(start, length):
36+
if target < candidates[i]:
37+
return
38+
self.combSum(candidates[:i] + candidates[i+1:], target - candidates[i], i, valueList + [candidates[i]])
39+
40+
```

118._pascal's_triangle.md

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
###118. Pascal's Triangle
2+
3+
题目:
4+
5+
<https://leetcode.com/problems/pascals-triangle/>
6+
7+
8+
难度:
9+
10+
Easy
11+
12+
13+
高中数学知识,把行数理理清楚就ok
14+
15+
16+
```
17+
class Solution(object):
18+
def generate(self, numRows):
19+
"""
20+
:type numRows: int
21+
:rtype: List[List[int]]
22+
"""
23+
res = [[1],[1,1]]
24+
if numRows < 3:
25+
return res[:numRows]
26+
for i in range(3, numRows+1):
27+
tmp = [1] * i
28+
for j in range(1,i-1):
29+
tmp[j] = res[i-2][j-1] + res[i-2][j]
30+
res.append(tmp)
31+
return res
32+
33+
34+
```
35+
36+

216._combination_sum_iii.md

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
###216. Combination Sum III
2+
3+
题目:
4+
5+
<https://leetcode.com/problems/combination-sum-iii/>
6+
7+
8+
难度:
9+
10+
Medium
11+
12+
继续Combination Sum 系列
13+
14+
15+
```
16+
class Solution(object):
17+
def combinationSum3(self, k, n):
18+
"""
19+
:type k: int
20+
:type n: int
21+
:rtype: List[List[int]]
22+
"""
23+
candidates = [1,2,3,4,5,6,7,8,9]
24+
self.res = []
25+
self.combSum(candidates, n, [], k)
26+
return self.res
27+
28+
29+
def combSum(self,candidates, target, valueList, k):
30+
if target == 0 and k == 0:
31+
self.res.append(valueList)
32+
length = len(candidates)
33+
if length == 0 or k < 0 :
34+
return
35+
for i in range(length):
36+
if candidates[i] > target:
37+
return
38+
self.combSum(candidates[i+1:], target - candidates[i], valueList + [candidates[i]], k-1)
39+
40+
```

backtracking思路.md

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
##以Generate Parentheses为例,backtrack的题到底该怎么去思考?
2+
3+
4+
所谓Backtracking都是这样的思路:在当前局面下,你有若干种选择。那么尝试每一种选择。如果已经发现某种选择肯定不行(因为违反了某些限定条件),就返回;如果某种选择试到最后发现是正确解,就将其加入解集
5+
6+
所以你思考递归题时,只要明确三点就行:选择 (Options),限制 (Restraints),结束条件 (Termination)。即“ORT原则”(这个是我自己编的)
7+
8+
9+
10+
11+
对于这道题,在任何时刻,你都有两种选择:
12+
1. 加左括号。
13+
2. 加右括号。
14+
15+
同时有以下限制:
16+
1. 如果左括号已经用完了,则不能再加左括号了。
17+
2. 如果已经出现的右括号和左括号一样多,则不能再加右括号了。因为那样的话新加入的右括号一定无法匹配。
18+
19+
结束条件是:
20+
左右括号都已经用完。
21+
22+
结束后的正确性:
23+
左右括号用完以后,一定是正确解。因为1. 左右括号一样多,2. 每个右括号都一定有与之配对的左括号。因此一旦结束就可以加入解集(有时也可能出现结束以后不一定是正确解的情况,这时要多一步判断)。
24+
25+
递归函数传入参数:
26+
限制和结束条件中有“用完”和“一样多”字样,因此你需要知道左右括号的数目。
27+
当然你还需要知道当前局面sublist和解集res。
28+
29+
因此,把上面的思路拼起来就是代码:
30+
31+
if (左右括号都已用完) {
32+
加入解集,返回
33+
}
34+
//否则开始试各种选择
35+
if (还有左括号可以用) {
36+
加一个左括号,继续递归
37+
}
38+
if (右括号小于左括号) {
39+
加一个右括号,继续递归
40+
}
41+
42+
43+
44+
你帖的那段代码逻辑中加了一条限制:“3. 是否还有右括号剩余。如有才加右括号”。这是合理的。不过对于这道题,如果满足限制1、2时,3一定自动满足,所以可以不判断3。
45+
46+
这题其实是最好的backtracking初学练习之一,因为ORT三者都非常简单明显。你不妨按上述思路再梳理一遍,还有问题的话再说。
47+
48+
49+
50+
以上文字来自 1point3arces的牛人解答

0 commit comments

Comments
 (0)