算法记录Day 29 | 回溯算法part05

63 阅读1分钟

算法记录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]
		}
	}
}