mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-09 19:44:45 +08:00
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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) => {
|
||||||
|
Reference in New Issue
Block a user