代码随想录算法训练营|day29

第七章 回溯算法

491.递增子序列

同层去重,只需保证当前层元素不重复即可【前仆后继的感觉】

复制代码
func findSubsequences(nums []int) [][]int {
	res, path := [][]int{}, []int{}
	var help func(nums []int, startIndex int)
	help = func(nums []int, startIndex int) {
		if len(path) > 1 {
			tmp := make([]int, len(path))
			copy(tmp, path)
			res = append(res, tmp)
		}
		used := make(map[int]bool, len(nums))
		for i := startIndex; i < len(nums); i++ {
			if used[nums[i]]|| len(path) > 0 && nums[i] < path[len(path)-1] {
				continue
			}
			path = append(path, nums[i])
			used[nums[i]] = true
			help(nums, i+1)
			path = path[:len(path)-1]
		}
	}
	help(nums, 0)
	return res
}

46.全排列

used数组,记录当前元素是否在path路径中存在,若存在则跳过。一个值在一条path路径中只能被选取一次

复制代码
func permute(nums []int) [][]int {
	res := [][]int{}
	path := []int{}
	used := make([]bool, len(nums))
	var help func(nums []int, index int)
	help = func(nums []int, index int) {
		if len(path) == len(nums) {
			tmp := make([]int, len(path))
			copy(tmp, path)
			res = append(res, tmp)
		}
		for i := 0; i < len(nums); i++ {
			if used[i] == true {
				continue
			}
			path = append(path, nums[i])
			used[i] = true
			help(nums, i+1)
			path = path[:len(path)-1]
			used[i] = false
		}
	}
	help(nums, 0)
	return res
}

47.全排列II

上题扩展,有重复元素。先排序,然后同层剪枝

同层剪枝:i > 0 && nums[i] == nums[i-1] && used[i-1] == false跳过,

nums[i-1]作为某一层元素,其所有的递归选择已经穷尽,回溯时才会有used[i - 1]==false。因此,当nums[i] == nums[i-1]跳过,否则nums[i]递归得到的结果与nums[i - 1]结果重复

复制代码
func permuteUnique(nums []int) [][]int {
	res := [][]int{}
	path := []int{}
	used := make([]bool, len(nums))
	sort.Ints(nums)
	var help func(nums []int, index int)
	help = func(nums []int, index int) {
		if len(path) == len(nums) {
			tmp := make([]int, len(path))
			copy(tmp, path)
			res = append(res, tmp)
			return
		}
		for i := 0; i < len(nums); i++ {
			if i > 0 && nums[i] == nums[i-1] && used[i-1] == false || used[i] == true {
				continue
			}
			used[i] = true
			path = append(path, nums[i])
			help(nums, i+1)
			path = path[:len(path)-1]
			used[i] = false
		}
	}
	help(nums, 0)
	return res
}

代码随想录文章详解

491.递增子序列
46.全排列
47.全排列II

总结

常做常新是怎么回事😢

代码随想录图示帮助好大

相关推荐
C++ 老炮儿的技术栈3 小时前
UDP 与 TCP 的区别是什么?
开发语言·c++·windows·算法·visual studio
殇者知忧4 小时前
【论文笔记】若干矿井粉尘检测算法概述
深度学习·神经网络·算法·随机森林·机器学习·支持向量机·计算机视觉
mochensage5 小时前
C++信息学竞赛中常用函数的一般用法
java·c++·算法
chengooooooo5 小时前
leetcode Top100 238. 除自身以外数组的乘积|数组系列
算法·leetcode
GUIQU.6 小时前
【每日一题 | 2025年6.2 ~ 6.8】第16届蓝桥杯部分偏简单题
算法·蓝桥杯·每日一题
weixin_527550406 小时前
初级程序员入门指南
javascript·python·算法
嘉陵妹妹8 小时前
深度优先算法学习
学习·算法·深度优先
GalaxyPokemon9 小时前
LeetCode - 53. 最大子数组和
算法·leetcode·职场和发展
hn小菜鸡9 小时前
LeetCode 1356.根据数字二进制下1的数目排序
数据结构·算法·leetcode
zhuiQiuMX9 小时前
分享今天做的力扣SQL题
sql·算法·leetcode