代码随想录算法训练营|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]跳过,否则numsi递归得到的结果与numsi - 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

总结

常做常新是怎么回事😢

代码随想录图示帮助好大

相关推荐
【心态好不摆烂】16 分钟前
数据结构基础精讲3
数据结构·算法
漂流瓶jz1 小时前
UVA-1613 K度图的着色 题解答案代码 算法竞赛入门经典第二版
算法·深度优先·图论·贪心·aoapc·算法竞赛入门经典·uva
我不会起名字3222 小时前
未接入最终读上限的参数:`websocketMaxMsgLen` 与 12.5 倍差距
后端·websocket·go·即时通讯·im·故障排查
Pniubi2 小时前
动态规划入门 ( - 力扣509斐波那契数)
算法·动态规划
吴长建先生重名了3 小时前
GitHub Actions部署报表系统踩坑记:幂等性与限
算法
贝壳6904 小时前
一个2026年2月才上传的库,凭什么敢碰2009年就有人写烂的题目
算法
王中阳Go4 小时前
100 件货卖出 116 件,库存停在 -16
后端·mysql·go
贝壳6904 小时前
同一道三亿位选型题,三个AI给了我三个答案,我把它们拉进同一台机器复跑
算法
青少儿编程课堂7 小时前
蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会图形化考级:校园大富翁经营闯关解析
c++·python·算法·bfs·信息学竞赛
在所不辞兄7 小时前
为什么在新能源汽车电驱与热管理开发中,AI驱动的数字孪生和数据驱动仿真正在部分替代对物理台架与实车标定的依赖?
人工智能·深度学习·神经网络·算法·机器学习