Skip to content

Commit 30e9c99

Browse files
authored
Merge branch 'youngyangyang04:master' into master
2 parents e037b87 + c20684f commit 30e9c99

File tree

4 files changed

+99
-86
lines changed

4 files changed

+99
-86
lines changed

problems/0037.解数独.md

Lines changed: 30 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -293,85 +293,40 @@ class Solution:
293293
"""
294294
Do not return anything, modify board in-place instead.
295295
"""
296-
def backtrack(board):
297-
for i in range(len(board)): #遍历行
298-
for j in range(len(board[0])): #遍历列
299-
if board[i][j] != ".": continue
300-
for k in range(1,10): #(i, j) 这个位置放k是否合适
301-
if isValid(i,j,k,board):
302-
board[i][j] = str(k) #放置k
303-
if backtrack(board): return True #如果找到合适一组立刻返回
304-
board[i][j] = "." #回溯,撤销k
305-
return False #9个数都试完了,都不行,那么就返回false
306-
return True #遍历完没有返回false,说明找到了合适棋盘位置了
307-
def isValid(row,col,val,board):
308-
for i in range(9): #判断行里是否重复
309-
if board[row][i] == str(val):
310-
return False
311-
for j in range(9): #判断列里是否重复
312-
if board[j][col] == str(val):
313-
return False
314-
startRow = (row // 3) * 3
315-
startcol = (col // 3) * 3
316-
for i in range(startRow,startRow + 3): #判断9方格里是否重复
317-
for j in range(startcol,startcol + 3):
318-
if board[i][j] == str(val):
319-
return False
320-
return True
321-
backtrack(board)
322-
```
323-
324-
Python3:
325-
326-
```python3
327-
class Solution:
328-
def __init__(self) -> None:
329-
self.board = []
330-
331-
def isValid(self, row: int, col: int, target: int) -> bool:
332-
for idx in range(len(self.board)):
333-
# 同列是否重复
334-
if self.board[idx][col] == str(target):
296+
self.backtracking(board)
297+
298+
def backtracking(self, board: List[List[str]]) -> bool:
299+
# 若有解,返回True;若无解,返回False
300+
for i in range(len(board)): # 遍历行
301+
for j in range(len(board[0])): # 遍历列
302+
# 若空格内已有数字,跳过
303+
if board[i][j] != '.': continue
304+
for k in range(1, 10):
305+
if self.is_valid(i, j, k, board):
306+
board[i][j] = str(k)
307+
if self.backtracking(board): return True
308+
board[i][j] = '.'
309+
# 若数字1-9都不能成功填入空格,返回False无解
335310
return False
336-
# 同行是否重复
337-
if self.board[row][idx] == str(target):
311+
return True # 有解
312+
313+
def is_valid(self, row: int, col: int, val: int, board: List[List[str]]) -> bool:
314+
# 判断同一行是否冲突
315+
for i in range(9):
316+
if board[row][i] == str(val):
338317
return False
339-
# 9宫格里是否重复
340-
box_row, box_col = (row // 3) * 3 + idx // 3, (col // 3) * 3 + idx % 3
341-
if self.board[box_row][box_col] == str(target):
318+
# 判断同一列是否冲突
319+
for j in range(9):
320+
if board[j][col] == str(val):
342321
return False
322+
# 判断同一九宫格是否有冲突
323+
start_row = (row // 3) * 3
324+
start_col = (col // 3) * 3
325+
for i in range(start_row, start_row + 3):
326+
for j in range(start_col, start_col + 3):
327+
if board[i][j] == str(val):
328+
return False
343329
return True
344-
345-
def getPlace(self) -> List[int]:
346-
for row in range(len(self.board)):
347-
for col in range(len(self.board)):
348-
if self.board[row][col] == ".":
349-
return [row, col]
350-
return [-1, -1]
351-
352-
def isSolved(self) -> bool:
353-
row, col = self.getPlace() # 找个空位置
354-
355-
if row == -1 and col == -1: # 没有空位置,棋盘被填满的
356-
return True
357-
358-
for i in range(1, 10):
359-
if self.isValid(row, col, i): # 检查这个空位置放i,是否合适
360-
self.board[row][col] = str(i) # 放i
361-
if self.isSolved(): # 合适,立刻返回, 填下一个空位置。
362-
return True
363-
self.board[row][col] = "." # 不合适,回溯
364-
365-
return False # 空位置没法解决
366-
367-
def solveSudoku(self, board: List[List[str]]) -> None:
368-
"""
369-
Do not return anything, modify board in-place instead.
370-
"""
371-
if board is None or len(board) == 0:
372-
return
373-
self.board = board
374-
self.isSolved()
375330
```
376331

377332
Go:

problems/0337.打家劫舍III.md

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -368,6 +368,41 @@ class Solution:
368368
return (val1, val2)
369369
```
370370

371+
Go:
372+
373+
> 动态规划
374+
375+
```go
376+
func rob(root *TreeNode) int {
377+
res := robTree(root)
378+
return max(res[0], res[1])
379+
}
380+
381+
func max(a, b int) int {
382+
if a > b {
383+
return a
384+
}
385+
return b
386+
}
387+
388+
func robTree(cur *TreeNode) []int {
389+
if cur == nil {
390+
return []int{0, 0}
391+
}
392+
// 后序遍历
393+
left := robTree(cur.Left)
394+
right := robTree(cur.Right)
395+
396+
// 考虑去偷当前的屋子
397+
robCur := cur.Val + left[0] + right[0]
398+
// 考虑不去偷当前的屋子
399+
notRobCur := max(left[0], left[1]) + max(right[0], right[1])
400+
401+
// 注意顺序:0:不偷,1:去偷
402+
return []int{notRobCur, robCur}
403+
}
404+
```
405+
371406
JavaScript:
372407

373408
> 动态规划

problems/0416.分割等和子集.md

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,32 @@ class Solution:
226226
return taraget == dp[taraget]
227227
```
228228
Go:
229+
```go
230+
// 分割等和子集 动态规划
231+
// 时间复杂度O(n^2) 空间复杂度O(n)
232+
func canPartition(nums []int) bool {
233+
sum := 0
234+
for _, num := range nums {
235+
sum += num
236+
}
237+
// 如果 nums 的总和为奇数则不可能平分成两个子集
238+
if sum % 2 == 1 {
239+
return false
240+
}
241+
242+
target := sum / 2
243+
dp := make([]int, target + 1)
244+
245+
for _, num := range nums {
246+
for j := target; j >= num; j-- {
247+
if dp[j] < dp[j - num] + num {
248+
dp[j] = dp[j - num] + num
249+
}
250+
}
251+
}
252+
return dp[target] == target
253+
}
254+
```
229255

230256
```go
231257
func canPartition(nums []int) bool {

problems/剑指Offer58-II.左旋转字符串.md

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -200,17 +200,14 @@ func reverse(b []byte, left, right int){
200200
JavaScript:
201201

202202
```javascript
203-
var reverseLeftWords = function (s, n) {
204-
const reverse = (str, left, right) => {
205-
let strArr = str.split("");
206-
for (; left < right; left++, right--) {
207-
[strArr[left], strArr[right]] = [strArr[right], strArr[left]];
208-
}
209-
return strArr.join("");
210-
}
211-
s = reverse(s, 0, n - 1);
212-
s = reverse(s, n, s.length - 1);
213-
return reverse(s, 0, s.length - 1);
203+
var reverseLeftWords = function(s, n) {
204+
const length = s.length;
205+
let i = 0;
206+
while (i < length - n) {
207+
s = s[length - 1] + s;
208+
i++;
209+
}
210+
return s.slice(0, length);
214211
};
215212
```
216213

0 commit comments

Comments
 (0)