Day25 回溯算法 part04

35 阅读2分钟

基础

刷题

  1. 非递减子序列

leetcode.cn/problems/no…

image.png

  1. 全排列

leetcode.cn/problems/pe…

image.png

  1. 全排列 II

leetcode.cn/problems/pe…

image.png

  1. 重新安排行程

写的太复杂了,该用一些库函数还是要用

image.png

记录一下这次的代码:

image.png

image.png

参考代码:


func findItinerary(tickets [][]string) []string {

var (

m = map[string][]string{}

res []string

)

for _, ticket := range tickets {

src, dst := ticket[0], ticket[1]

m[src] = append(m[src], dst)

}

for key := range m {

sort.Strings(m[key])

}

  


var dfs func(curr string)

dfs = func(curr string) {

for {

if v, ok := m[curr]; !ok || len(v) == 0 {

break

}

tmp := m[curr][0]

m[curr] = m[curr][1:]

dfs(tmp)

}

res = append(res, curr)

}

  


dfs("JFK")

fmt.Println(res)

for i := 0; i < len(res)/2; i++ {

res[i], res[len(res) - 1 - i] = res[len(res) - 1 - i], res[i]

}

return res

}
  1. N皇后

leetcode.cn/problems/n-…

image.png

初始化一个n*n的空二维数组

从第一行开始,加入Q,将Q皇后的攻击范围(下面,左下,右下)位置填写为“.”

为什么,没有上面,左上,右上和左右?

前一行已经将攻击范围标记为“.”, 只要在遍历这一行中将Q放到为空的元素上,就不会被上面的皇后攻击到,左右不设置为“.”,是为了方便遍历整个行,一行一定只放一个皇后,在遍历中就会限制,就不需要标记了。

func solveNQueens(n int) (result [][]string) {

record := make([][]string,n)

for i:=0; i<n; i++ {

record[i] = make([]string, n)

}

var backTracking func(int)

backTracking = func(depth int) {

if depth == n {

tmpResult := make([]string, 0, n)

for y:=0;y<n;y++ {

tmp := ""

for x:=0;x<n;x++ {

if record[y][x] == "" {

tmp += "."

}else {

tmp += record[y][x]

}

}

tmpResult = append(tmpResult, tmp)

}

result = append(result, tmpResult)

return

}

for i:=0; i<n; i++ {

// fmt.Println(depth, i)

// fmt.Println(record)

if record[depth][i] == "." {

continue

}

record[depth][i] = "Q"

// fmt.Println(record)

attackRange := make([][]int, 0)

// attack down

for j := depth+1; j <n ; j++ {

if record[j][i] == "." {

continue

}

attackRange = append(attackRange, []int{j, i})

record[j][i] = "."

}

// attack left down

for j,k := depth+1,i-1; j<n && k>=0; j, k = j+1, k-1 {

if record[j][k] == "." {

continue

}

attackRange = append(attackRange, []int{j,k})

record[j][k] = "."

}

  


//attack right down

for j,k := depth+1,i+1; j<n && k<n; j, k = j+1, k+1 {

if record[j][k] == "." {

continue

}

attackRange = append(attackRange, []int{j,k})

record[j][k] = "."

}

backTracking(depth+1)

for _, item := range attackRange {

record[item[0]][item[1]] = ""

}

record[depth][i] = ""

}

}

backTracking(0)

return

}

  1. 解数独

leetcode.cn/problems/su…

image.png

总结

golang 中 for循环如何如何定义两个变量,并对两个变量进行修改

image.png


for i, j := 0, 1; i < 10; i, j = i+1, j+1 {
        fmt.Println("i,j",i,j)
    }