首页 > 其他分享 >回溯_20230413

回溯_20230413

时间:2023-04-14 12:02:14浏览次数:33  
标签:数字 nums res 20230413 子集 数组 回溯 path

90.子集II

给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。

说明:解集不能包含重复的子集。

示例:

  • 输入: [1,2,2]
  • 输出: [ [2], [1], [1,2,2], [2,2], [1,2], [] ]

解题思路:

通过回溯法遍历出子集,保证res不包含该path的情况下,将path添加进res中(此处应注意要使用new ArrayList<>(path),否则res所有元素用的是同一块内存会一起变化)。要明确子集不是全排列,与后续的题目有所不同

为了防止出现重复子集的情况,有以下几种方法

  • 对nums数组先进行排序,在某一位置出现过某一数字之后,此后该位置不会再出现该数字,即nums[i] == nums[i - 1]的情况可以直接跳过,且此法可以避免把[1, 2, 3]和[2, 1, 3]当成不同子集的情况(后者通过在下一层的backTracking中指定后续数字必须往上一层的后面取(index + 1),故后者根本不会出现)
  • 在加入res前对path进行转换校验(耗时耗力)

491.递增子序列

给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2。

示例:

  • 输入: [4, 6, 7, 7]
  • 输出: [[4, 6], [4, 7], [4, 6, 7], [4, 6, 7, 7], [6, 7], [6, 7, 7], [7,7], [4,7,7]]

解题思路:

要注意此题与90.子集II的不同之处在于,本题是要找出递增子序列,不能对数组排序。通过res保存最终结果和path保存过程结果,当path.size() >= 2时即可加入结果。

去重本题使用HashSet,在每一层的backTracking中都设置一个set来存储当前层数出现过的数字,保证在index位置处相同的数字只能出现一次,否则continue。同样可以通过if (res.contains(path))的方法实现去重

46.全排列

给定一个 没有重复 数字的序列,返回其所有可能的全排列。

示例:

  • 输入: [1,2,3]
  • 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]

解题思路:

该题已明确数组没有重复数字,且因为是全排列问题,自然无需考虑结果去重问题。res记录最终结果,path记录每一个元素,当path的大小与数组相同时说明满足条件可以加入res。但本题需要注意,相同的数字不能重复使用,可以通过boolean[] used来记录数字的使用情况,也可以通过path.contains(nums[i])来判定有无重复(因为数字没有重复所以可以使用此法)

47.全排列 II

给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。

示例 1:

  • 输入:nums = [1,1,2]
  • 输出: [[1,1,2], [1,2,1], [2,1,1]]

示例 2:

  • 输入:nums = [1,2,3]
  • 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

解题思路:

通过一个res记录结果,path记录过程

该题与46.全排列的不同之处在于,数字序列包含重复数字。那么便无法通过path.contains(nums[i])来判定有无重复。此处去重可以通过以下两种方法

  • 通过HashSet来判定在该轮backTracking中是否出现过
  • 事先对数组进行排序,此后nums[i + 1] == nums[i]便直接跳过

同时结合boolean[] used记录下数组中每个位置的数字的使用情况,使用过则跳过直至所有数字都使用为止

标签:数字,nums,res,20230413,子集,数组,回溯,path
From: https://www.cnblogs.com/xccx-0824/p/17317885.html

相关文章

  • 总结20230413
    今天周四,一周内最轻松的一天。今天只有一节体育课,体育课第一轮的比赛已经打完,结果不是很理想,三胜三负,小组里面是第四名,但是还有第二轮比赛,所以重新燃起自信,迎接第二轮的胜利,第二轮是根据第一轮的结果来分配的,希望分配到B组,有机会能杀出重围,与A组对打。今天晚上敲了大概两小时的j......
  • 随笔20230413
    突然很想找个根本不讲中文的国家生活个一年两年。远离世俗、所有人,只和自己的灵魂独处一会,仔细地问问自己,你、我究竟从何而来,又终将魂归何处。我有深厚的基础生物知识,我系统学习过大量的理工科知识,我理解万事万物都有其运行的规律我明白一切缘起都终将湮灭可是我还是固执的认......
  • 回溯理论基础及leetcode
    回溯与递归相辅相成;回溯是递归的副产品,只要有递归就会有回溯。回溯函数也就是递归函数,指的都是一个函数。回溯搜索法纯暴力搜索解决的问题组合问题:N个数里面按一定规则找出k个数的集合切割问题:一个字符串按一定规则有几种切割方式子集问题:一个N个数的集合里有多少符合条......
  • UVa 10344 23 out of 5 (全排列枚举&回溯)
    10344-23outof5Timelimit:3.000secondshttp://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=1285Yourtaskistowriteaprogramthatcandecidewhetheryoucanfindanarithmetic......
  • UVa 129 Krypton Factor (回溯好题)
    129-KryptonFactorTimelimit:3.000secondshttp://uva.onlinejudge.org/index.php?option=onlinejudge&page=show_problem&problem=65YouhavebeenemployedbytheorganisersofaSuperKryptonFactorContestinwhichcontestantshaveveryhighmental......
  • UVa 11210 Chinese Mahjong (模拟&枚举&回溯)
    11210-ChineseMahjongTimelimit:3.000secondshttp://uva.onlinejudge.org/index.php?option=onlinejudge&page=show_problem&problem=2151Mahjong()isagameofChineseoriginusuallyplayedbyfourpersonswithtilesresemblingdominoesandbearing......
  • 【LeetCode回溯算法#extra01】集合划分问题【火柴拼正方形、划分k个相等子集、公平发
    火柴拼正方形https://leetcode.cn/problems/matchsticks-to-square/你将得到一个整数数组matchsticks,其中matchsticks[i]是第i个火柴棒的长度。你要用所有的火柴棍拼成一个正方形。你不能折断任何一根火柴棒,但你可以把它们连在一起,而且每根火柴棒必须使用一次。如......
  • Java中常用算法及示例-分治、迭代、递归、递推、动态规划、回溯、穷举、贪心
    场景1、分治算法的基本思想是将一个计算复杂的问题分成规模较小、计算简单的小问题求解,然后综合各个小问题,得到最终答案。2、穷举(又称枚举)算法的基本思想是从所有可能的情况中搜索正确的答案。3、迭代法(IterativeMethod)无法使用公式一次求解,而需要使用重复结构(即循环)......
  • 回溯算法与树遍历
    树的遍历于回溯算法树的遍历是指按照一定的顺序访问树中的节点,以便遍历树中的所有节点。常见的树的遍历方式有三种,分别是前序遍历(Pre-orderTraversal)、中序遍历(In-orderTraversal)和后序遍历(Post-orderTraversal)。前序遍历先访问根节点,然后依次访问左子树和右子树;中序遍历先访......
  • 递归-回溯2
    namespaceJD;publicclassJDTest{publicstaticvoidShow(){int[]arr={1,2,3,4,5,6,7};varroot=BuildTree2(arr,0,arr.Length-1);varstack=newStack<int>();varrtList=newList<int>();......