Skip to content

Commit a8f071f

Browse files
committed
Merge branch 'youngyangyang04:master' into dev
2 parents 335ce63 + f5d2d2c commit a8f071f

13 files changed

+344
-49
lines changed

problems/0046.全排列.md

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,45 @@ class Solution {
182182
```
183183

184184
Python:
185+
```python3
186+
class Solution:
187+
def permute(self, nums: List[int]) -> List[List[int]]:
188+
res = [] #存放符合条件结果的集合
189+
path = [] #用来存放符合条件的结果
190+
used = [] #用来存放已经用过的数字
191+
def backtrack(nums,used):
192+
if len(path) == len(nums):
193+
return res.append(path[:]) #此时说明找到了一组
194+
for i in range(0,len(nums)):
195+
if nums[i] in used:
196+
continue #used里已经收录的元素,直接跳过
197+
path.append(nums[i])
198+
used.append(nums[i])
199+
backtrack(nums,used)
200+
used.pop()
201+
path.pop()
202+
backtrack(nums,used)
203+
return res
204+
```
185205

206+
Python(优化,不用used数组):
207+
```python3
208+
class Solution:
209+
def permute(self, nums: List[int]) -> List[List[int]]:
210+
res = [] #存放符合条件结果的集合
211+
path = [] #用来存放符合条件的结果
212+
def backtrack(nums):
213+
if len(path) == len(nums):
214+
return res.append(path[:]) #此时说明找到了一组
215+
for i in range(0,len(nums)):
216+
if nums[i] in path: #path里已经收录的元素,直接跳过
217+
continue
218+
path.append(nums[i])
219+
backtrack(nums) #递归
220+
path.pop() #回溯
221+
backtrack(nums)
222+
return res
223+
```
186224

187225
Go:
188226
```Go

problems/0055.跳跃游戏.md

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,20 @@ func canJUmp(nums []int) bool {
141141
}
142142
```
143143

144-
144+
Javascript:
145+
```Javascript
146+
var canJump = function(nums) {
147+
if(nums.length === 1) return true
148+
let cover = 0
149+
for(let i = 0; i <= cover; i++) {
150+
cover = Math.max(cover, i + nums[i])
151+
if(cover >= nums.length - 1) {
152+
return true
153+
}
154+
}
155+
return false
156+
};
157+
```
145158

146159

147160
-----------------------

problems/0078.子集.md

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,20 @@ class Solution {
205205
```
206206

207207
Python:
208-
208+
```python3
209+
class Solution:
210+
def subsets(self, nums: List[int]) -> List[List[int]]:
211+
res = []
212+
path = []
213+
def backtrack(nums,startIndex):
214+
res.append(path[:]) #收集子集,要放在终止添加的上面,否则会漏掉自己
215+
for i in range(startIndex,len(nums)): #当startIndex已经大于数组的长度了,就终止了,for循环本来也结束了,所以不需要终止条件
216+
path.append(nums[i])
217+
backtrack(nums,i+1) #递归
218+
path.pop() #回溯
219+
backtrack(nums,0)
220+
return res
221+
```
209222

210223
Go:
211224
```Go

problems/0090.子集II.md

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,23 @@ class Solution {
208208
```
209209

210210
Python:
211-
211+
```python3
212+
class Solution:
213+
def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
214+
res = [] #存放符合条件结果的集合
215+
path = [] #用来存放符合条件结果
216+
def backtrack(nums,startIndex):
217+
res.append(path[:])
218+
for i in range(startIndex,len(nums)):
219+
if i > startIndex and nums[i] == nums[i - 1]: #我们要对同一树层使用过的元素进行跳过
220+
continue
221+
path.append(nums[i])
222+
backtrack(nums,i+1) #递归
223+
path.pop() #回溯
224+
nums = sorted(nums) #去重需要排序
225+
backtrack(nums,0)
226+
return res
227+
```
212228

213229
Go:
214230
```Go

problems/0142.环形链表II.md

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -234,25 +234,19 @@ class Solution:
234234
```
235235

236236
Go:
237-
```func detectCycle(head *ListNode) *ListNode {
238-
if head ==nil{
239-
return head
240-
}
241-
slow:=head
242-
fast:=head.Next
243-
244-
for fast!=nil&&fast.Next!=nil{
245-
if fast==slow{
246-
slow=head
247-
fast=fast.Next
248-
for fast!=slow {
249-
fast=fast.Next
250-
slow=slow.Next
237+
```go
238+
func detectCycle(head *ListNode) *ListNode {
239+
slow, fast := head, head
240+
for fast != nil && fast.Next != nil {
241+
slow = slow.Next
242+
fast = fast.Next.Next
243+
if slow == fast {
244+
for slow != head {
245+
slow = slow.Next
246+
head = head.Next
251247
}
252-
return slow
248+
return head
253249
}
254-
fast=fast.Next.Next
255-
slow=slow.Next
256250
}
257251
return nil
258252
}

problems/0150.逆波兰表达式求值.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,22 @@ var evalRPN = function(tokens) {
224224
};
225225
```
226226

227+
python3
228+
229+
```python
230+
def evalRPN(tokens) -> int:
231+
stack = list()
232+
for i in range(len(tokens)):
233+
if tokens[i] not in ["+", "-", "*", "/"]:
234+
stack.append(tokens[i])
235+
else:
236+
tmp1 = stack.pop()
237+
tmp2 = stack.pop()
238+
res = eval(tmp2+tokens[i]+tmp1)
239+
stack.append(str(int(res)))
240+
return stack[-1]
241+
```
242+
227243

228244
-----------------------
229245
* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw)

problems/0232.用栈实现队列.md

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,50 @@ class MyQueue {
282282

283283

284284
Python:
285+
```python
286+
# 使用两个栈实现先进先出的队列
287+
class MyQueue:
288+
def __init__(self):
289+
"""
290+
Initialize your data structure here.
291+
"""
292+
self.stack1 = list()
293+
self.stack2 = list()
294+
295+
def push(self, x: int) -> None:
296+
"""
297+
Push element x to the back of queue.
298+
"""
299+
# self.stack1用于接受元素
300+
self.stack1.append(x)
301+
302+
def pop(self) -> int:
303+
"""
304+
Removes the element from in front of queue and returns that element.
305+
"""
306+
# self.stack2用于弹出元素,如果self.stack2为[],则将self.stack1中元素全部弹出给self.stack2
307+
if self.stack2 == []:
308+
while self.stack1:
309+
tmp = self.stack1.pop()
310+
self.stack2.append(tmp)
311+
return self.stack2.pop()
312+
313+
def peek(self) -> int:
314+
"""
315+
Get the front element.
316+
"""
317+
if self.stack2 == []:
318+
while self.stack1:
319+
tmp = self.stack1.pop()
320+
self.stack2.append(tmp)
321+
return self.stack2[-1]
322+
323+
def empty(self) -> bool:
324+
"""
325+
Returns whether the queue is empty.
326+
"""
327+
return self.stack1 == [] and self.stack2 == []
328+
```
285329

286330

287331
Go:

problems/0343.整数拆分.md

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,6 @@ dp[i]的定义讲贯彻整个解题过程,下面哪一步想不懂了,就想
5151

5252
**那有同学问了,j怎么就不拆分呢?**
5353

54-
j是从1开始遍历,拆分j的情况,在遍历j的过程中其实都计算过了。
55-
56-
**那有同学问了,j怎么就不拆分呢?**
57-
5854
j是从1开始遍历,拆分j的情况,在遍历j的过程中其实都计算过了。那么从1遍历j,比较(i - j) * j和dp[i - j] * j 取最大的。递推公式:dp[i] = max(dp[i], max((i - j) * j, dp[i - j] * j));
5955

6056
也可以这么理解,j * (i - j) 是单纯的把整数拆分为两个数相乘,而j * dp[i - j]是拆分成两个以及两个以上的个数相乘。
@@ -213,8 +209,19 @@ class Solution {
213209
```
214210

215211
Python:
216-
217-
212+
```python
213+
class Solution:
214+
def integerBreak(self, n: int) -> int:
215+
dp = [0] * (n + 1)
216+
dp[2] = 1
217+
for i in range(3, n + 1):
218+
# 假设对正整数 i 拆分出的第一个正整数是 j(1 <= j < i),则有以下两种方案:
219+
# 1) 将 i 拆分成 j 和 i−j 的和,且 i−j 不再拆分成多个正整数,此时的乘积是 j * (i-j)
220+
# 2) 将 i 拆分成 j 和 i−j 的和,且 i−j 继续拆分成多个正整数,此时的乘积是 j * dp[i-j]
221+
for j in range(1, i):
222+
dp[i] = max(dp[i], max(j * (i - j), j * dp[i - j]))
223+
return dp[n]
224+
```
218225
Go:
219226

220227

problems/0404.左叶子之和.md

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,51 @@ class Solution:
226226
```
227227
Go:
228228

229-
229+
JavaScript:
230+
递归版本
231+
```javascript
232+
var sumOfLeftLeaves = function(root) {
233+
//采用后序遍历 递归遍历
234+
// 1. 确定递归函数参数
235+
const nodesSum = function(node){
236+
// 2. 确定终止条件
237+
if(node===null){
238+
return 0;
239+
}
240+
let leftValue = sumOfLeftLeaves(node.left);
241+
let rightValue = sumOfLeftLeaves(node.right);
242+
// 3. 单层递归逻辑
243+
let midValue = 0;
244+
if(node.left&&node.left.left===null&&node.left.right===null){
245+
midValue = node.left.val;
246+
}
247+
let sum = midValue + leftValue + rightValue;
248+
return sum;
249+
}
250+
return nodesSum(root);
251+
};
252+
```
253+
迭代版本
254+
```javascript
255+
var sumOfLeftLeaves = function(root) {
256+
//采用层序遍历
257+
if(root===null){
258+
return null;
259+
}
260+
let queue = [];
261+
let sum = 0;
262+
queue.push(root);
263+
while(queue.length){
264+
let node = queue.shift();
265+
if(node.left!==null&&node.left.left===null&&node.left.right===null){
266+
sum+=node.left.val;
267+
}
268+
node.left&&queue.push(node.left);
269+
node.right&&queue.push(node.right);
270+
}
271+
return sum;
272+
};
273+
```
230274

231275

232276

problems/0491.递增子序列.md

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,28 @@ class Solution {
229229

230230

231231
Python:
232-
232+
```python3
233+
class Solution:
234+
def findSubsequences(self, nums: List[int]) -> List[List[int]]:
235+
res = []
236+
path = []
237+
def backtrack(nums,startIndex):
238+
repeat = [] #这里使用数组来进行去重操作
239+
if len(path) >=2:
240+
res.append(path[:]) #注意这里不要加return,要取树上的节点
241+
for i in range(startIndex,len(nums)):
242+
if nums[i] in repeat:
243+
continue
244+
if len(path) >= 1:
245+
if nums[i] < path[-1]:
246+
continue
247+
repeat.append(nums[i]) #记录这个元素在本层用过了,本层后面不能再用了
248+
path.append(nums[i])
249+
backtrack(nums,i+1)
250+
path.pop()
251+
backtrack(nums,0)
252+
return res
253+
```
233254

234255
Go:
235256

0 commit comments

Comments
 (0)