首页 > 编程语言 >[代码随想录]Day25-回溯算法part05

[代码随想录]Day25-回溯算法part05

时间:2023-08-23 11:24:36浏览次数:46  
标签:used nums Day25 随想录 part05 len int res path

题目:491. 递增子序列

思路:

核心问题——同层去重,这一题不能够重新排序因此不可以用i > index && nums[i] == nums[i-1]来去重,而是每一层开一个map来判断该数是否出现过

代码:

var (
    res [][]int
    path []int
)
func findSubsequences(nums []int) [][]int {
    res = make([][]int, 0)
    path = make([]int, 0, len(nums))
    FindSubsequences(nums, 0)
    return res
}

func FindSubsequences(nums []int, index int) {
    if len(path) >= 2 { // 只要长度大于等于2就可以添加
        res = append(res, append([]int{},path...))
    }
    isExist := make(map[int]bool) // 同层去重
    for i := index; i < len(nums); i++ {
        if isExist[nums[i]] == true {
            continue
        }
        lens := len(path)
        if lens == 0 || nums[i] >= path[lens-1] { // 如果path没有数或者最后一个数小于等于当前就递归
            path = append(path, nums[i])
            isExist[nums[i]] = true
            FindSubsequences(nums, i + 1)
            path = path[:lens]
        }
    }
}

参考:

代码随想录

题目:46. 全排列

思路:

全排列的used数组就是用来保证同一分支下不会多次使用同一个元素

代码:

var (
    res [][]int
    path []int
    used []bool
)
func permute(nums []int) [][]int {
    res = make([][]int, 0)
    path = make([]int, 0, len(nums))
    used = make([]bool, len(nums))
    Permute(nums)
    return res
}

func Permute(nums []int) {
    if len(path) == len(nums) { // 排列完成
        res = append(res, append([]int{},path...))
        return
    }
    for i, ok := range used { // 直接遍历used
        if ok { // 如果已经被使用过了
            continue
        }
        used[i] = true // 标记
        path = append(path, nums[i])
        Permute(nums)
        path = path[:len(path)-1]
        used[i] = false // 取消标记
    }
    return
}

参考:

代码随想录

题目:47. 全排列 II

思路:

有重复的全排列,used身兼数职,首先要用来判断同层不会重复i > 0 && nums[i] == nums[i-1] && used[i-1] == false .
还要判断同枝没有复用!ok

代码:

var (
    res     [][]int
    path    []int
    used    []bool
)
func permuteUnique(nums []int) [][]int {
    res = make([][]int, 0)
    path = make([]int, 0, len(nums))
    used = make([]bool, len(nums))
    sort.Ints(nums)
    PermuteUnique(nums)
    return res
}

func PermuteUnique(nums []int) {
    if len(nums) == len(path) {
        res = append(res, append([]int{},path...))
        return
    }
    for i, ok := range used {
        if i > 0 && nums[i] == nums[i-1] && used[i-1] == false {
            continue
        }
        if !ok {
            used[i] = true
            path = append(path,nums[i])
            PermuteUnique(nums)
            path = path[:len(path)-1]
            used[i] = false
        }
    }
}

参考:

代码随想录

标签:used,nums,Day25,随想录,part05,len,int,res,path
From: https://www.cnblogs.com/wtcsky/p/17650706.html

相关文章

  • [代码随想录]Day24-回溯算法part04
    题目:93.复原IP地址思路:函数参数:参数就一个stirng,path先收集ip地址的四个部分,最后存入res中时拼接成一个string,因此path和res都是[]string类型终止条件:当path有了ip的四个部分就终止;当然只有完全的把字符串遍历了才会存入res单层逻辑:先取1-3位,判断是不是0-255内的数并且没......
  • 代码随想录算法训练营第二十一天| 530.二叉搜索树的最小绝对差 501.二叉搜索树中的
     530.二叉搜索树的最小绝对差   卡哥建议:需要领悟一下二叉树遍历上双指针操作,优先掌握递归   题目链接/文章讲解:https://programmercarl.com/0530.%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E7%9A%84%E6%9C%80%E5%B0%8F%E7%BB%9D%E5%AF%B9%E5%B7%AE.html ......
  • 代码随想录算法训练营第二十天| 654.最大二叉树 617.合并二叉树 700.二叉搜索树
      654.最大二叉树    卡哥建议:又是构造二叉树,昨天大家刚刚做完 中序后序确定二叉树,今天做这个 应该会容易一些, 先看视频,好好体会一下 为什么构造二叉树都是 前序遍历    题目链接/文章讲解:https://programmercarl.com/0654.%E6%9C%80%E5%A4%A7%E4%BA%8C%E5......
  • [代码随想录]Day22-回溯算法part02
    题目:216.组合总和III思路:多加一个记录和的参数,还有一个起始位置的参数(不重复就得加)结束条件是个数到了k:如果此时sum==n那就说明答案正确如果此时sum!=n那就直接返回剪枝的话:如果之后的和大于n那就没必要继续遍历了代码:varres[][]int//答案varpath[]int......
  • 代码随想录算法训练营第六天|242.有效的字母异位词 349. 两个数组的交集 202. 快乐数
     哈希表部分:哈希表,简单来说就是k-v形式查询的结构,用来快速判断一个元素是否出现集合里,如hashmap核心是哈希函数,k存哈希函数的值,找的时候找查询项的哈希函数值就行,返回v 出现哈希碰撞的时候,查找的流程怎么走呢?(*存疑,之后查一下) 类型:数组+集合set(set、multiset、unordered......
  • 代码随想录算法训练营第三天| 203.移除链表元素 ,707.设计链表 ,206.反转链表
    203.移除链表元素题目给你一个链表的头节点head和一个整数val,请你删除链表中所有满足Node.val==val的节点,并返回新的头节点。第一想法定义一个指针a指向头节点,顺序遍历链表,循环结束的条件是指针a.next为null删除操作是判断a.next.val=val时让a.next=a.next.nex......
  • [代码随想录]Day21-回溯算法part01
    题目:77.组合思路:回溯就是dfs的一个特殊情况也就是递归的一种情况,值得注意的一点:要记得深拷贝,不然最后全是空代码:varres[][]intvarpath[]intfunccombine(nint,kint)[][]int{res=[][]int{}path=make([]int,0,k)Combine(n,1,k,0)ret......
  • [代码随想录]Day20-二叉树part09
    题目:669.修剪二叉搜索树思路:遍历到的值小于最小值,说明左子树里的所有节点都小于最小值,舍弃左子树。遍历到的值大于最大值,说明右子树里的所有节点都大于最大值,舍弃右子树。如果在范围内,就拼接左右子树然后返回节点代码:/***Definitionforabinarytreenode.*typeTr......
  • 代码随想录算法训练营第十八天| 513.找树左下角的值 112. 路径总和 106.从中序与
     找树左下角的值     卡哥建议:本地递归偏难,反而迭代简单属于模板题, 两种方法掌握一下   题目链接/文章讲解/视频讲解:https://programmercarl.com/0513.%E6%89%BE%E6%A0%91%E5%B7%A6%E4%B8%8B%E8%A7%92%E7%9A%84%E5%80%BC.html   做题思路:   题目说......
  • 代码随想录算法训练营第十七天| 110.平衡二叉树 257. 二叉树的所有路径 404.左叶子
     卡哥建议:迭代法,大家可以直接过,二刷有精力的时候 再去掌握迭代法。  110.平衡二叉树 (优先掌握递归)   卡哥建议:再一次涉及到,什么是高度,什么是深度,可以巩固一下。   题目链接/文章讲解/视频讲解:https://programmercarl.com/0110.%E5%B9%B3%E8%A1%A1%E4%BA%8C%......