Merge pull request #1033 from chengleqi/master

update 0051.N皇后.md Go版本
This commit is contained in:
程序员Carl
2022-01-26 10:01:06 +08:00
committed by GitHub
3 changed files with 66 additions and 129 deletions

View File

@ -346,70 +346,57 @@ class Solution {
### Go ### Go
```Go ```Go
import "strings" func solveNQueens(n int) [][]string {
var res [][]string var res [][]string
chessboard := make([][]string, n)
func isValid(board [][]string, row, col int) (res bool){ for i := 0; i < n; i++ {
n := len(board) chessboard[i] = make([]string, n)
for i:=0; i < row; i++ {
if board[i][col] == "Q" {
return false
}
} }
for i := 0; i < n; i++ { for i := 0; i < n; i++ {
if board[row][i] == "Q" { for j := 0; j < n; j++ {
return false chessboard[i][j] = "."
} }
} }
var backtrack func(int)
for i ,j := row, col; i >= 0 && j >=0 ; i, j = i - 1, j- 1{ backtrack = func(row int) {
if board[i][j] == "Q"{ if row == n {
return false temp := make([]string, n)
} for i, rowStr := range chessboard {
} temp[i] = strings.Join(rowStr, "")
for i, j := row, col; i >=0 && j < n; i,j = i-1, j+1 {
if board[i][j] == "Q" {
return false
}
}
return true
}
func backtrack(board [][]string, row int) {
size := len(board)
if row == size{
temp := make([]string, size)
for i := 0; i<size;i++{
temp[i] = strings.Join(board[i],"")
} }
res = append(res, temp) res = append(res, temp)
return return
} }
for col := 0; col < size; col++ {
if !isValid(board, row, col){
continue
}
board[row][col] = "Q"
backtrack(board, row+1)
board[row][col] = "."
}
}
func solveNQueens(n int) [][]string {
res = [][]string{}
board := make([][]string, n)
for i := 0; i < n; i++ { for i := 0; i < n; i++ {
board[i] = make([]string, n) if isValid(n, row, i, chessboard) {
} chessboard[row][i] = "Q"
for i := 0; i < n; i++{ backtrack(row + 1)
for j := 0; j<n;j++{ chessboard[row][i] = "."
board[i][j] = "."
} }
} }
backtrack(board, 0) }
backtrack(0)
return res return res
} }
func isValid(n, row, col int, chessboard [][]string) bool {
for i := 0; i < row; i++ {
if chessboard[i][col] == "Q" {
return false
}
}
for i, j := row-1, col-1; i >= 0 && j >= 0; i, j = i-1, j-1 {
if chessboard[i][j] == "Q" {
return false
}
}
for i, j := row-1, col+1; i >= 0 && j < n; i, j = i-1, j+1 {
if chessboard[i][j] == "Q" {
return false
}
}
return true
}
``` ```
### Javascript ### Javascript
```Javascript ```Javascript

View File

@ -272,40 +272,27 @@ func uniquePathsWithObstacles(obstacleGrid [][]int) int {
for i, _ := range dp { for i, _ := range dp {
dp[i] = make([]int, n) dp[i] = make([]int, n)
} }
// 初始化 // 初始化, 如果是障碍物, 后面的就都是0, 不用循环了
for i:=0;i<m;i++ { for i := 0; i < m && obstacleGrid[i][0] == 0; i++ {
// 如果是障碍物, 后面的就都是0, 不用循环了
if obstacleGrid[i][0] == 1 {
break
}
dp[i][0] = 1 dp[i][0] = 1
} }
for i:=0;i<n;i++ { for i := 0; i < n && obstacleGrid[0][i] == 0; i++ {
if obstacleGrid[0][i] == 1 {
break
}
dp[0][i] = 1 dp[0][i] = 1
} }
// dp数组推导过程 // dp数组推导过程
for i := 1; i < m; i++ { for i := 1; i < m; i++ {
for j := 1; j < n; j++ { for j := 1; j < n; j++ {
// 如果obstacleGrid[i][j]这个点是障碍物, 那么我们的dp[i][j]保持为0 // 如果obstacleGrid[i][j]这个点是障碍物, 那么dp[i][j]保持为0
if obstacleGrid[i][j] != 1 { if obstacleGrid[i][j] != 1 {
// 否则我们需要计算当前点可以到达的路径数 // 否则我们需要计算当前点可以到达的路径数
dp[i][j] = dp[i-1][j] + dp[i][j-1] dp[i][j] = dp[i-1][j] + dp[i][j-1]
} }
} }
} }
// debug遍历dp
//for i,_ := range dp {
// for j,_ := range dp[i] {
// fmt.Printf("%.2v,",dp[i][j])
// }
// fmt.Println()
//}
return dp[m-1][n-1] return dp[m-1][n-1]
} }
``` ```
Javascript Javascript

View File

@ -289,7 +289,7 @@ func findTargetSumWays(nums []int, target int) int {
for _, v := range nums { for _, v := range nums {
sum += v sum += v
} }
if target > sum { if abs(target) > sum {
return 0 return 0
} }
if (sum+target)%2 == 1 { if (sum+target)%2 == 1 {
@ -311,49 +311,12 @@ func findTargetSumWays(nums []int, target int) int {
} }
return dp[bag] return dp[bag]
} }
```
> 更新版上一个跑不通了因为会存在bag 小于0的情况
```go func abs(x int) int {
func findTargetSumWays(nums []int, target int) int { return int(math.Abs(float64(x)))
//先转化为数学问题
//a-b=target
//a+b=sum
//a=(target+sum)/2
//求出sum
var sum int
for _,value:=range nums{
sum+=value
}
//如果sum<target或者 sum+target不是偶数因为a是int 或者两者之和小于0了
if sum<target||(sum+target)%2==1||(sum+target)<0{
return 0
}
//开始dp初始化
dp:=make([][]int,len(nums)+1)
for i:=0;i<=len(nums);i++{
tmp:=make([]int,(target+sum)/2+1)//背包容量
dp[i]=tmp
}
dp[0][0]=1//当背包容量为0且物品为0时填满背包就1种方法
for i:=0;i<len(nums)+1;i++{
if i==0{
continue
}
for j:=0;j<(target+sum)/2+1;j++{
if nums[i-1]<=j{//如果背包装的下
dp[i][j]=dp[i-1][j]+dp[i-1][j-nums[i-1]]
}else{
dp[i][j]=dp[i-1][j]
}
}
}
return dp[len(nums)][(target+sum)/2]
} }
``` ```
Javascript Javascript
```javascript ```javascript
const findTargetSumWays = (nums, target) => { const findTargetSumWays = (nums, target) => {