题目

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

思考分析以及代码

这一题和前面的做过的两个题目有所关联:
leetcode 46. 全排列 思考分析
再加上leetcode 491. 递增子序列 思考分析类似的去重操作。
先画出解空间树的图:
红色部分才是真正意义上的去重:值相同的跳过。
蓝色部分指的是我们用过的元素不能再用了。在组合问题中由于for循环进入下一层是i+1,所以本身就将用过的元素排除了。然而在排列问题中,我们可能要用到序号靠前且没有使用过的元素,所以需要通过限制去除。

这里的“去重”我用到了两个数组:

vector<bool> used;
int usedArray[21]={0}; //这里使用数组来进行去重操作。

used存放的是树深度上的元素是否“用过”的信息,用过的元素将不会再用。
usedArray存放的是树这一层上的元素是否是重复的元素,重复的元素将不会再用。
所以used是全局变量,usedArray是本层的局部变量。
下面是代码:

class Solution {public:vector<vector<int>> result;vector<int> res;vector<bool> used;void backtracking(vector<int>& nums){//如果res元素个数和nums一样多说明一个排列已经完成if(res.size() == nums.size()){result.push_back(res);return;}int usedArray[21]={0}; //这里使用数组来进行去重操作。for(int i=0;i<nums.size();i++){//used存放的是树深度上的元素是否“用过”的信息,用过的元素将不会再用。//usedArray存放的是树这一层上的元素是否是重复的元素,重复的元素将不会再用//元素可以是重复但没有用过。if(used[i] == false && usedArray[nums[i]+10] ==0){usedArray[nums[i]+10] =1;//处理结点;used[i]=true;res.push_back(nums[i]);//递归,探索下一层backtracking(nums);      //递归//回溯,撤销处理结果res.pop_back();used[i]=false;}//如果这个元素已经用过了,不做处理}return;}vector<vector<int>> permuteUnique(vector<int>& nums) {result.clear();res.clear();//装载used数组for(int i=0;i<nums.size();i++)  used.push_back(false);//开始回溯backtracking(nums);return result;}
};

剑指 Offer 38. 字符串的排列

https://leetcode-cn.com/problems/zi-fu-chuan-de-pai-lie-lcof/
这一题类似。

leetcode 47. 全排列 II 思考分析相关推荐

  1. leetcode 90. 子集 II 思考分析

    与本题相关联的题目解析: leetcode 78. 子集 思考分析 leetcode 40. 组合总和 II思考分析 题目 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集 ...

  2. [LeetCode]47. 全排列 II

    47. 全排列 II 难度中等761收藏分享切换为英文接收动态反馈 给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列. 示例 1: 输入:nums = [1,1,2] 输出 ...

  3. LeetCode 47. 全排列 II【数组,回溯算法,排序去重】

    47. 全排列 II 给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列. 示例 1: 输入:nums = [1,1,2] 输出: [[1,1,2], [1,2,1], [2 ...

  4. LeetCode 47 全排列 II -- 回溯法

    来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/permutations-ii 题意: 给定一个可包含重复数字的序列 nums ,按任意顺序 返 ...

  5. LeetCode 47. 全排列 II

    文章目录 解法1:回溯 + 剪枝 牛客网的全排列 https://leetcode-cn.com/problems/permutations-ii/ 难度:中等   给定一个可包含重复数字的序列,返回 ...

  6. LeetCode 47. 全排列 II(回溯+搜索剪枝)

    文章目录 1. 题目信息 2. 解题 1. 题目信息 给定一个可包含重复数字的序列,返回所有不重复的全排列. 示例:输入: [1,1,2] 输出: [[1,1,2],[1,2,1],[2,1,1] ] ...

  7. Leetcode 47. 全排列 II (每日一题 20211015)

    给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列.示例 1:输入:nums = [1,1,2] 输出: [[1,1,2],[1,2,1],[2,1,1]] 示例 2:输入: ...

  8. LeetCode 47 全排列 II

    题目描述 给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列. 题解 注意这里只有在不相等的时候才进行交换. 代码 class Solution {public:vector ...

  9. 2022-2-23 Leetcode 47.全排列 II

    重点在于剪枝,这个和 组合总和 的剪枝类似. class Solution {vector<int> vis;public:void backtrack(vector<int> ...

最新文章

  1. 使用FoundationDB高效地将SQL数据映射到NoSQL存储系统中
  2. Jenkins+Gradle+Git+Pyger+二维码搭建Android自动打包平台
  3. weblogic内存溢出linux,解决weblogic内存溢出有关问题
  4. UICollectionView reloadData后cell被隐藏
  5. 大专计算机应用技术答辩,计算机应用技术专业硕士答辩.ppt
  6. 阿里巴巴测试相关内容
  7. C# ComBox 垂直滚动条
  8. Atitti 载入类的几种方法    Class.forName ClassLoader.loadClass  直接new
  9. 新书即将上市:《善用佳软:高效能人士的软件应用之道》
  10. MathType安装教程,以及部分功能变灰,重新点亮
  11. matlab插值函数
  12. 无缘无故的推荐弹窗,wps的锅,解决办法
  13. 2022年,北京将建设22.4公里的轨道交通
  14. 租房退租时,房东不退押金怎么办?
  15. EditPlus格式化xml文档
  16. 微博实时号权重是什么,如何养成高权重高的号
  17. bilibili缓存视频的位置
  18. 股票实时数据接口软件的数据来源是哪里?
  19. yml中${}的意思
  20. JavaScript设计模式 Item 6 --单例模式Singleton

热门文章

  1. 【TypeScript系列教程14】Array数组对象的常见的方法
  2. vue学习经验分享,在这个大前端时代,你再不会vue就out啦
  3. java开发一款模拟写字板系统
  4. 利用最新Apache解析漏洞(CVE-2017-15715)绕过上传黑名单
  5. 精心挑选的23款美轮美奂的 jQuery 图片特效插件
  6. jQuery -- 光阴似箭(五):AJAX 方法
  7. PhantomJS宣布终止开发
  8. css用一张大图片来设置背景的技术真相
  9. Web前端行业的机遇与自我规划,如果你对未来没有方向 不如看一看,或许就是一道曙光!
  10. 响应式布局 max-device-width 与 max-width 的区别