leetcode 47. 全排列 II 思考分析
题目
给定一个可包含重复数字的序列 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 思考分析相关推荐
- leetcode 90. 子集 II 思考分析
与本题相关联的题目解析: leetcode 78. 子集 思考分析 leetcode 40. 组合总和 II思考分析 题目 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集 ...
- [LeetCode]47. 全排列 II
47. 全排列 II 难度中等761收藏分享切换为英文接收动态反馈 给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列. 示例 1: 输入:nums = [1,1,2] 输出 ...
- LeetCode 47. 全排列 II【数组,回溯算法,排序去重】
47. 全排列 II 给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列. 示例 1: 输入:nums = [1,1,2] 输出: [[1,1,2], [1,2,1], [2 ...
- LeetCode 47 全排列 II -- 回溯法
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/permutations-ii 题意: 给定一个可包含重复数字的序列 nums ,按任意顺序 返 ...
- LeetCode 47. 全排列 II
文章目录 解法1:回溯 + 剪枝 牛客网的全排列 https://leetcode-cn.com/problems/permutations-ii/ 难度:中等 给定一个可包含重复数字的序列,返回 ...
- LeetCode 47. 全排列 II(回溯+搜索剪枝)
文章目录 1. 题目信息 2. 解题 1. 题目信息 给定一个可包含重复数字的序列,返回所有不重复的全排列. 示例:输入: [1,1,2] 输出: [[1,1,2],[1,2,1],[2,1,1] ] ...
- Leetcode 47. 全排列 II (每日一题 20211015)
给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列.示例 1:输入:nums = [1,1,2] 输出: [[1,1,2],[1,2,1],[2,1,1]] 示例 2:输入: ...
- LeetCode 47 全排列 II
题目描述 给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列. 题解 注意这里只有在不相等的时候才进行交换. 代码 class Solution {public:vector ...
- 2022-2-23 Leetcode 47.全排列 II
重点在于剪枝,这个和 组合总和 的剪枝类似. class Solution {vector<int> vis;public:void backtrack(vector<int> ...
最新文章
- 使用FoundationDB高效地将SQL数据映射到NoSQL存储系统中
- Jenkins+Gradle+Git+Pyger+二维码搭建Android自动打包平台
- weblogic内存溢出linux,解决weblogic内存溢出有关问题
- UICollectionView reloadData后cell被隐藏
- 大专计算机应用技术答辩,计算机应用技术专业硕士答辩.ppt
- 阿里巴巴测试相关内容
- C# ComBox 垂直滚动条
- Atitti 载入类的几种方法 Class.forName ClassLoader.loadClass 直接new
- 新书即将上市:《善用佳软:高效能人士的软件应用之道》
- MathType安装教程,以及部分功能变灰,重新点亮
- matlab插值函数
- 无缘无故的推荐弹窗,wps的锅,解决办法
- 2022年,北京将建设22.4公里的轨道交通
- 租房退租时,房东不退押金怎么办?
- EditPlus格式化xml文档
- 微博实时号权重是什么,如何养成高权重高的号
- bilibili缓存视频的位置
- 股票实时数据接口软件的数据来源是哪里?
- yml中${}的意思
- JavaScript设计模式 Item 6 --单例模式Singleton