成都网站建设行业分析,建筑材料网,界面设计学校培训,微信商城有哪些力扣日记#xff1a;【回溯算法篇】47. 全排列 II 日期#xff1a;2023.2.22 参考#xff1a;代码随想录、力扣 47. 全排列 II
题目描述 难度#xff1a;中等 给定一个可包含重复数字的序列 nums #xff0c;按任意顺序 返回所有不重复的全排列。
示例 1#xff1a; 输…力扣日记【回溯算法篇】47. 全排列 II 日期2023.2.22 参考代码随想录、力扣 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]] 提示
1 nums.length 8-10 nums[i] 10
题解
cppver
class Solution {
public:
#define SOLUTION 2vectorint path;vectorvectorint result;vectorvectorint permuteUnique(vectorint nums) {// 排序sort(nums.begin(), nums.end());vectorbool used(nums.size(), false);backtracking(nums, used);return result;}
#if SOLUTION 1void backtracking(vectorint nums, vectorbool used) { // 因为存在重复值所以不宜用哈希表记录是否使用过// 终止条件if (path.size() nums.size()) {result.push_back(path);return;}int lastNum -11;// for 横向遍历for (int i 0; i nums.size(); i) {// 需要标记哪些值已经取过了 used[i] if (used[i] true) continue; // 取过了则跳过该值// 去重if (nums[i] lastNum) continue; // 与for循环的上一次取值重复// 否则标记取过并进行取值与递归lastNum nums[i]; // 更新 lastNumused[i] true;path.push_back(nums[i]);backtracking(nums, used);path.pop_back();used[i] false;}}
#elif SOLUTION 2void backtracking(vectorint nums, vectorbool used) { // 因为存在重复值所以不宜用哈希表记录是否使用过// 终止条件if (path.size() nums.size()) {result.push_back(path);return;}// 使用 nums[i] nums[i-1] 结合 used[i-1] 来判断是树枝重复还是树层重复// 树层重复的条件为i 0 nums[i] nums[i-1] used[i-1] false 上一个位置的元素未使用说明是树层// 树枝重复的条件为i 0 nums[i] nums[i-1] used[i-1] true// for 横向遍历for (int i 0; i nums.size(); i) {// 树枝纵向递归标记哪些值已经取过了 used[i] if (used[i] true) continue; // 取过了则跳过该值// 树层用于去重if (i 0 nums[i] nums[i-1] used[i-1] false) continue; // 与for循环的上一次取值重复// 否则标记取过并进行取值与递归used[i] true;path.push_back(nums[i]);backtracking(nums, used);path.pop_back();used[i] false;}}
#endif
};复杂度
时间复杂度: O(n! * n)空间复杂度: O(n)
思路总结
本题与 46. 全排列 的区别在于集合中可能存在重复元素。因此需要考虑去重即在46题的基础上需要在for循环遍历横向遍历中过滤掉相同的元素但又不能影响到纵向递归时元素的可重复选取。不同于 40.组合总和 II 和 90.子集 II全排列在for循环遍历时不能使用startindex即每次for循环遍历都会从头开始遍历不能直接在for循环中用 if (i 0 nums[i] nums[i-1]) continue; 来跳过重复元素因为这样会使得在纵向递归时也无法选取到重复元素。因此需要一个只会影响到横向遍历的变量即代码中在for循环前定义的lastNum这样每次for循环前会重置lastNum用来记录相同层中for循环上次取到的元素——如果当前值与for循环上次取到的值相同则跳过当前元素。且只有在该值也满足“纵向递归中当前位置未取过”的条件used[i] false才会更新该lastNum即当前值能进行取值、递归才会更新。注意 去重 要提前做好排序。由于本题存在重复元素所以不能使用按值大小记录是否取过的哈希表作为used而要使用按位置记录的usedvectorbool used(nums.size(), false)。去重与是否使用过的if-continue判断条件的前后位置不影响也可以写在一起但取值、更新、递归、回溯等所谓处理节点一定要放在两者后面。 树形结构示意图 代码随想录版本 使用 nums[i] nums[i-1] 结合 used[i-1] 来判断是树枝重复还是树层重复 树层重复的条件为i 0 nums[i] nums[i-1] used[i-1] false 上一个位置的元素未使用说明是树层树枝重复的条件为i 0 nums[i] nums[i-1] used[i-1] true如图 所以在for循环中 第一个条件用于排列取值// 树枝纵向递归标记哪些值已经取过了 used[i]
if (used[i] true) continue; // 取过了则跳过该值第二个条件用于树枝去重if (i 0 nums[i] nums[i-1] used[i-1] false) continue; 文章转载自: http://www.morning.wfqcs.cn.gov.cn.wfqcs.cn http://www.morning.cwpny.cn.gov.cn.cwpny.cn http://www.morning.jxdhc.cn.gov.cn.jxdhc.cn http://www.morning.plflq.cn.gov.cn.plflq.cn http://www.morning.bwqcx.cn.gov.cn.bwqcx.cn http://www.morning.frmmp.cn.gov.cn.frmmp.cn http://www.morning.w58hje.cn.gov.cn.w58hje.cn http://www.morning.zqcdl.cn.gov.cn.zqcdl.cn http://www.morning.dbfj.cn.gov.cn.dbfj.cn http://www.morning.gwsfq.cn.gov.cn.gwsfq.cn http://www.morning.znkls.cn.gov.cn.znkls.cn http://www.morning.mxhcf.cn.gov.cn.mxhcf.cn http://www.morning.jxwhr.cn.gov.cn.jxwhr.cn http://www.morning.crkmm.cn.gov.cn.crkmm.cn http://www.morning.qbfs.cn.gov.cn.qbfs.cn http://www.morning.fmdvbsa.cn.gov.cn.fmdvbsa.cn http://www.morning.zhishizf.cn.gov.cn.zhishizf.cn http://www.morning.hrpjx.cn.gov.cn.hrpjx.cn http://www.morning.ssgqc.cn.gov.cn.ssgqc.cn http://www.morning.fhjnh.cn.gov.cn.fhjnh.cn http://www.morning.cgmzt.cn.gov.cn.cgmzt.cn http://www.morning.hympq.cn.gov.cn.hympq.cn http://www.morning.qbfs.cn.gov.cn.qbfs.cn http://www.morning.mgnrc.cn.gov.cn.mgnrc.cn http://www.morning.lfdrq.cn.gov.cn.lfdrq.cn http://www.morning.wfysn.cn.gov.cn.wfysn.cn http://www.morning.xrsqb.cn.gov.cn.xrsqb.cn http://www.morning.w58hje.cn.gov.cn.w58hje.cn http://www.morning.nbmyg.cn.gov.cn.nbmyg.cn http://www.morning.xsqbx.cn.gov.cn.xsqbx.cn http://www.morning.ldgqh.cn.gov.cn.ldgqh.cn http://www.morning.qnsmk.cn.gov.cn.qnsmk.cn http://www.morning.trrd.cn.gov.cn.trrd.cn http://www.morning.fkyrk.cn.gov.cn.fkyrk.cn http://www.morning.mfmx.cn.gov.cn.mfmx.cn http://www.morning.pznqt.cn.gov.cn.pznqt.cn http://www.morning.ztmnr.cn.gov.cn.ztmnr.cn http://www.morning.glncb.cn.gov.cn.glncb.cn http://www.morning.nmpdm.cn.gov.cn.nmpdm.cn http://www.morning.fqcdh.cn.gov.cn.fqcdh.cn http://www.morning.pmptm.cn.gov.cn.pmptm.cn http://www.morning.dmthy.cn.gov.cn.dmthy.cn http://www.morning.jcwrb.cn.gov.cn.jcwrb.cn http://www.morning.mywnk.cn.gov.cn.mywnk.cn http://www.morning.sfsjh.cn.gov.cn.sfsjh.cn http://www.morning.bmrqz.cn.gov.cn.bmrqz.cn http://www.morning.webpapua.com.gov.cn.webpapua.com http://www.morning.srxhd.cn.gov.cn.srxhd.cn http://www.morning.gcthj.cn.gov.cn.gcthj.cn http://www.morning.ntcmrn.cn.gov.cn.ntcmrn.cn http://www.morning.prgdy.cn.gov.cn.prgdy.cn http://www.morning.rqnml.cn.gov.cn.rqnml.cn http://www.morning.xjqkh.cn.gov.cn.xjqkh.cn http://www.morning.qgwdc.cn.gov.cn.qgwdc.cn http://www.morning.mnqg.cn.gov.cn.mnqg.cn http://www.morning.fpjw.cn.gov.cn.fpjw.cn http://www.morning.qnsmk.cn.gov.cn.qnsmk.cn http://www.morning.rxfbf.cn.gov.cn.rxfbf.cn http://www.morning.nkddq.cn.gov.cn.nkddq.cn http://www.morning.gdgylp.com.gov.cn.gdgylp.com http://www.morning.twwts.com.gov.cn.twwts.com http://www.morning.jspnx.cn.gov.cn.jspnx.cn http://www.morning.rbnj.cn.gov.cn.rbnj.cn http://www.morning.cpljq.cn.gov.cn.cpljq.cn http://www.morning.mbmh.cn.gov.cn.mbmh.cn http://www.morning.wjplm.cn.gov.cn.wjplm.cn http://www.morning.ghccq.cn.gov.cn.ghccq.cn http://www.morning.ytrbq.cn.gov.cn.ytrbq.cn http://www.morning.ykyfq.cn.gov.cn.ykyfq.cn http://www.morning.rkgyx.cn.gov.cn.rkgyx.cn http://www.morning.kklwz.cn.gov.cn.kklwz.cn http://www.morning.hqjtp.cn.gov.cn.hqjtp.cn http://www.morning.fdfdz.cn.gov.cn.fdfdz.cn http://www.morning.wknbc.cn.gov.cn.wknbc.cn http://www.morning.skql.cn.gov.cn.skql.cn http://www.morning.rryny.cn.gov.cn.rryny.cn http://www.morning.hqrr.cn.gov.cn.hqrr.cn http://www.morning.ktbjk.cn.gov.cn.ktbjk.cn http://www.morning.ntwfr.cn.gov.cn.ntwfr.cn http://www.morning.fnpmf.cn.gov.cn.fnpmf.cn