代码随想录算法训练营|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

总结

常做常新是怎么回事😢

代码随想录图示帮助好大

相关推荐
冻柠檬飞冰走茶7 小时前
PTA基础编程题目集 7-35有理数均值(C++语言实现)
开发语言·数据结构·c++·算法·均值算法
民乐团扒谱机7 小时前
【微实验】倒谱算法(Cepstrum)深度解析:原理、数学推导与代码实现
人工智能·算法·语音识别
worxfr8 小时前
Go 底层心智模型:并发、内存与闭包
go
Nil2088 小时前
leetcode 189轮转数组
数据结构·算法·leetcode
-dzk-8 小时前
【动态规划】LC 118.杨辉三角
算法·动态规划
恣逍信点8 小时前
《凌微经》静态自悖——变化之自因
人工智能·科技·算法·机器学习·业界资讯·拓扑学·哲学
吃着火锅x唱着歌9 小时前
LeetCode 3885.设计事件管理器
算法·leetcode·职场和发展
土司大王9 小时前
LeetCode hto100——字母异位词分组
java·算法·leetcode
Eloudy9 小时前
预词力:LLM 的唯一形式化能力
人工智能·算法·agent
依然鸣9 小时前
PTA团体程序设计天梯赛L1真题讲解L1-085-088
数据结构·c++·经验分享·算法·深度优先·pat考试