// 10 491.递增子序列
package main
import "fmt"
func findSubsequences(nums []int) [][]int {
// 全局变量
res := [][]int{}
path := []int{}
// 回溯函数
var backtracking func(nums []int, start int)
backtracking = func(nums []int, start int) {
//收获结果,排除只有一个元素的情况
if len(path) > 1 {
temp := make([]int, len(path))
copy(temp, path)
res = append(res, temp)
}
//子集问题不用写终止条件
//局部去重
uset := make(map[int]bool, len(nums))
//for循环遍历每一个结点,注意剪枝
for i := start; i < len(nums); i++ {
if uset[nums[i]] {
continue
}
if len(path) == 0 || nums[i] >= path[len(path)-1] { //排除只有一个元素和递减序列
uset[nums[i]] = true //对于每一层去重,不用回溯
path = append(path, nums[i])
backtracking(nums, i+1)
path = path[:len(path)-1]
}
}
return
}
backtracking(nums, 0)
return res
}
func main() {
nums := []int{4, 6, 7, 7}
res := findSubsequences(nums)
fmt.Printf("res: %v\n", res) //res: [[4 6] [4 6 7] [4 6 7 7] [4 7] [4 7 7] [6 7] [6 7 7] [7 7]]
}
// 11 46 全排列
package main
import (
"fmt"
"sort"
)
func permute(nums []int) [][]int {
// 全局变量
res := [][]int{}
path := []int{}
used := make([]bool, len(nums))
sort.Ints(nums)
// 回溯函数
var backtracking func(nums []int, used []bool)
backtracking = func(nums []int, used []bool) {
// 终止条件
if len(path) == len(nums) {
temp := make([]int, len(path))
copy(temp, path)
res = append(res, temp)
return
}
//for循环遍历每个元素,注意树层去重和树枝去重
for i := 0; i < len(nums); i++ {
if used[i] == true {
continue
}
path = append(path, nums[i])
used[i] = true
backtracking(nums, used)
path = path[:len(path)-1]
used[i] = false
}
return
}
backtracking(nums, used)
return res
}
func main() {
nums := []int{1, 2, 3}
res := permute(nums)
fmt.Printf("res: %v\n", res) //res: [[1 2 3] [1 3 2] [2 1 3] [2 3 1] [3 1 2] [3 2 1]]
}
// 12 47 全排列II
package main
import (
"fmt"
"sort"
)
func permuteUnique(nums []int) [][]int {
// 全局变量
res := [][]int{}
path := []int{}
used := make([]bool, len(nums))
sort.Ints(nums)
// 回溯函数
var backtracking func(nums []int, used []bool)
backtracking = func(nums []int, used []bool) {
// 终止条件
if len(path) == len(nums) {
temp := make([]int, len(path))
copy(temp, path)
res = append(res, temp)
return
}
//for循环遍历每个元素,注意树层去重和树枝去重
for i := 0; i < len(nums); i++ {
if i > 0 && nums[i] == nums[i-1] && used[i-1] == false { //树层去重
continue
}
if used[i] == true {
continue
}
path = append(path, nums[i])
used[i] = true
backtracking(nums, used)
path = path[:len(path)-1]
used[i] = false
}
return
}
backtracking(nums, used)
return res
}
func main() {
nums := []int{1, 1, 2}
res := permuteUnique(nums)
fmt.Printf("res: %v\n", res) //res: [[1 1 2] [1 2 1] [2 1 1]]
}