Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 30e9c99

Browse files
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 inrange(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)

AltStyle によって変換されたページ (->オリジナル) /