首页 > 其他分享 >代码随想录day25 || 491 递增子序列,46 全排列, 47 全排列2

代码随想录day25 || 491 递增子序列,46 全排列, 47 全排列2

时间:2024-08-10 14:28:51浏览次数:14  
标签:排列 nums day25 res 随想录 len int var path

491 递增子序列

func findSubsequences(nums []int) [][]int {
	// 思路,在原数组上面找寻递增子序列,所以不能改变顺序,

	var path []int
	var res [][]int
	//nums = quicksort(nums)
	backtracking(nums, &path, &res, -200) // 范围是【-100, 100】,传入一个不在区间的数字就不会重复
	return res
}

func backtracking(nums []int, path *[]int, res *[][]int, last int) {
	if len(nums) == 0 {
		return
	}

	used := make(map[int]bool)
	for i:=0; i<len(nums); i++ {
		if used[nums[i]] {
			continue
		}
		if nums[i] < last{
			continue
		}

		*path = append(*path, nums[i])
		used[nums[i]] = true
		if len(*path) > 1 {
			var copypath = make([]int, len(*path))
			copy(copypath, *path)
			*res = append(*res, copypath)
		}
		backtracking(nums[i+1 : ], path, res, nums[i])
		*path = (*path)[0 : len(*path) - 1]
	}
	return
}

image

func backtracking(nums []int, path *[]int, res *[][]int, startidx int) {
	if startidx == len(nums) {
		return
	}

	used := make(map[int]bool)
	for i:=startidx; i<len(nums); i++ {
		if used[nums[i]] {
			continue
		}
		
		// 注意不是对比相邻元素,而是对比当前元素与路径最后一个元素
		if  len(*path) > 0  && nums[i] < (*path)[len(*path) - 1]{
			continue
		}

		*path = append(*path, nums[i])
		used[nums[i]] = true
		if len(*path) > 1 {
			var copypath = make([]int, len(*path))
			copy(copypath, *path)
			*res = append(*res, copypath)
		}
		backtracking(nums, path, res, i+1)
		*path = (*path)[0 : len(*path) - 1]
	}
	return
}

46 全排列

func permute(nums []int) [][]int {
	// 组合问题相比排列问题,递归时候传入的数组不是nums[i+1: ], 而是nums.Remove(nums[i])
	var path []int
	var res [][]int
	backtracking(nums, &path, &res)
	return res
}

func backtracking(nums []int, path *[]int, res *[][]int) {
	if len(nums) == 0 {
		var copyPath = make([]int, len(*path))
		copy(copyPath, *path)
		*res = append(*res, copyPath)
		return
	}

	for i:=0; i<len(nums); i++{
		*path = append(*path, nums[i])
		// 新的数组要去除nums[i], 但是要包含其他的元素
		//在 Go 中,切片操作 nums[a:b] 是合法的,只要满足以下条件:
		//0 <= a <= b <= len(nums)
		//nums[a:b] 返回从索引 a 开始到索引 b-1 结束的子切片。

		//var newNums = make([]int, len(nums) - 1)
		//copy(newNums, nums[0: i])
		//copy(newNums[i: ], nums[i+1: ])

		var newNums []int
		newNums = append(newNums, nums[0 : i]...)
		newNums = append(newNums, nums[i+1: ]...)
		backtracking(newNums, path, res)
		*path = (*path)[ : len(*path) - 1]
	}
	return
}
// 两个易错点,newnums声明如果放到for循环外面可能出现错误,多次append导致newnums不断累加
// 第二点易错,使用copy函数注意第二个copy dst是newnums[i: ] 而不是newnums, 这样会覆盖第一个copy结果

全排列2

func permuteUnique(nums []int) [][]int {
	// 组合问题相比排列问题,递归时候传入的数组不是nums[i+1: ], 而是nums.Remove(nums[i])
	var path []int
	var res [][]int
	backtracking(nums, &path, &res)
	return res
}

func backtracking(nums []int, path *[]int, res *[][]int) {
	if len(nums) == 0 {
		var copyPath = make([]int, len(*path))
		copy(copyPath, *path)
		*res = append(*res, copyPath)
		return
	}

	var used = make(map[int]bool)
	for i:=0; i<len(nums); i++{
		if used[nums[i]] {
			continue
		}
		used[nums[i]] = true
		*path = append(*path, nums[i])
		var newNums []int
		newNums = append(newNums, nums[0 : i]...)
		newNums = append(newNums, nums[i+1: ]...)
		backtracking(newNums, path, res)
		*path = (*path)[ : len(*path) - 1]
	}
	return
}
// 相比上一题,加了一个used数组保存使用过的元素

标签:排列,nums,day25,res,随想录,len,int,var,path
From: https://www.cnblogs.com/zhougongjin55/p/18352243

相关文章

  • 实训day25(8.9)
    一、方法一指定pip从哪个源服务器下载和安装Python包pip3configsetglobal.index-url清华镜像站https://pypi.tuna.tsinghua.edu.cn/simple安装SQLAlchemyyum-yinstallsqlalchemy使用pip3安装pandas库pip3installpandas导入pandas作为pdimportpanda......
  • 「代码随想录算法训练营」第三十四天 | 动态规划 part7
    198.打家劫舍题目链接:https://leetcode.cn/problems/house-robber/文章讲解:https://programmercarl.com/0198.打家劫舍.html题目难度:中等视频讲解:https://www.bilibili.com/video/BV1Te411N7SX题目状态:有点思路但不全。思路:这次的dp[i]数组表示在到第i个房间中时最多的......
  • 代码随想录Day10
    232.用栈实现队列请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):实现MyQueue类:voidpush(intx)将元素x推到队列的末尾intpop()从队列的开头移除并返回元素intpeek()返回队列开头的元素booleanempty()如果队列为......
  • 代码随想录算法训练营day08|344.反转字符串,541.反转字符串II,卡码网:54.替换数字
    344.反转字符串题目链接:https://leetcode.cn/problems/reverse-string/description/我的代码:classSolution{public:voidreverseString(vector<char>&s){for(inti=0;i<s.size()/2;i++){chartemp=s[i];s[i]=......
  • 代码随想录day24 || 93 复原IP地址,78 子集, 90 子集2
    93复原ip地址funcrestoreIpAddresses(sstring)[]string{ //字符串分割问题,考虑回溯算法 varpath,res[]string iflen(s)<4{ returnres } backtracking(s,&path,&res) returnres}funcbacktracking(sstring,path*[]string,res*[]string){ ifle......
  • 代码随想录Day9
    KMP算法主要用来进行字符串匹配KMP的主要思想是当出现字符串不匹配时,可以知道一部分之前已经匹配的文本内容,可以利用这些信息避免从头再去做匹配了。所以如何记录已经匹配的文本内容,是KMP的重点,也是next数组肩负的重任。next数组就是一个前缀表(prefixtable)。前缀表有什么作......
  • 「代码随想录算法训练营」第三十三天 | 动态规划 part6
    322.零钱兑换题目链接:https://leetcode.cn/problems/coin-change/文章讲解:https://programmercarl.com/0322.零钱兑换.html题目难度:中等视频讲解:https://www.bilibili.com/video/BV14K411R7yv/题目状态:略微有点思路,但还是有点转不过来。思路:这次是找最小的钱币组合,因此......
  • 代码随想录算法刷题训练营day49:LeetCode(42)接雨水、LeetCode(84)柱状图中最大的矩形
    代码随想录算法刷题训练营day49:LeetCode(42)接雨水、LeetCode(84)柱状图中最大的矩形LeetCode(42)接雨水题目代码importjava.util.Stack;classSolution{publicinttrap(int[]height){//用单调栈进行操作intsum=0;Stack<Integ......
  • 代码随想录算法训练营第64天 | 图论:Floyd 算法+A * 算法
    97.小明逛公园https://kamacoder.com/problempage.php?pid=1155Floyd算法精讲https://www.programmercarl.com/kamacoder/0097.小明逛公园.html#floyd-算法精讲Floyd算法精讲问题总结:双向道路;路径规划;多个起点到多个终点核心思想:动态规划确定dp数组和下标含义:grid......
  • 代码随想录day23 || 39 组合总和,40 组合总和2,131 分割回文串
    39组合总和funccombinationSum(candidates[]int,targetint)[][]int{ //思路,组合问题考虑回溯算法,考虑到元素可能重复问题,所以,树的最大深度应该是target/min(candudates)+1 varpath=[]int{} varres=[][]int{} backtracking(target,candidates,&path,&res......