算法记录Day 27 | 回溯算法part04
LeetCode # 491.递增子序列
题目链接:491. 非递减子序列
题解
func findSubsequences(nums []int) [][]int {
res := make([][]int, 0)
dfs491(nums, 0, []int{}, &res)
return res
}
func dfs491(nums []int, start int, path []int, res *[][]int) {
if len(path) > 1 {
temp := make([]int, len(path))
copy(temp, path)
*res = append(*res, temp)
}
set := make(map[int]bool, 0)
for i := start; i < len(nums); i++ {
if len(path) > 0 && nums[i] < path[len(path)-1] || set[nums[i]] {
continue
}
set[nums[i]] = true
path = append(path, nums[i])
dfs491(nums, i+1, path, res)
path = path[:len(path)-1]
}
}
LeetCode 46.全排列
题目链接:46. 全排列
题解
func permute(nums []int) [][]int {
res := make([][]int, 0)
used := make([]bool, len(nums))
dfs46(nums, []int{}, used, &res)
return res
}
func dfs46(nums []int, path []int, used []bool, res *[][]int) {
if len(path) == len(nums) {
temp := make([]int, len(path))
copy(temp, path)
*res = append(*res, temp)
}
for i := 0; i < len(nums); i++ {
if used[i] {
continue
}
used[i] = true
path = append(path, nums[i])
dfs46(nums, path, used, res)
used[i] = false
path = path[:len(path)-1]
}
}
LeetCode 47.全排列 II
题目链接:47. 全排列 II
题解
import "sort"
func permuteUnique(nums []int) [][]int {
res := make([][]int, 0)
used := make([]bool, len(nums))
sort.Ints(nums)
dfs47(nums, []int{}, used, &res)
return res
}
func dfs47(nums []int, path []int, used []bool, res *[][]int) {
if len(path) == len(nums) {
temp := make([]int, len(path))
copy(temp, path)
*res = append(*res, temp)
}
for i := 0; i < len(nums); i++ {
if i > 0 && nums[i] == nums[i-1] && !used[i-1] {
continue
}
if !used[i] {
used[i] = true
path = append(path, nums[i])
dfs47(nums, path, used, res)
used[i] = false
path = path[:len(path)-1]
}
}
}