基础
刷题
- 非递减子序列
- 全排列
- 全排列 II
- 重新安排行程
写的太复杂了,该用一些库函数还是要用
记录一下这次的代码:
参考代码:
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
}
- N皇后
初始化一个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
}
- 解数独
总结
golang 中 for循环如何如何定义两个变量,并对两个变量进行修改
for i, j := 0, 1; i < 10; i, j = i+1, j+1 {
fmt.Println("i,j",i,j)
}