题目描述
输入一组数字(可能包含重复数字),输出其所有的排列方式。
样例
Input:[1,2,3]
Output:[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
解题思路
-
描述
本题目就是使用暴力搜索。
由于存在重复数字,难点在于如何去重——指定相同数字的位置顺序即可。
-
实现代码:
vector<vector<int> > res; vector<int> path; vector<vector<int>> permutation(vector<int>& nums) { path.resize(nums.size()); sort(nums.begin(),nums.end()); // 对nums进行排序 dfs(nums,0,0,0); return res; } // index表明现在排列第几个元素,start表明应该从哪一位开始排列,state表明目前nums数的使用状况 void dfs(vector<int>& nums,int index,int start,int state) { if(index == nums.size()) { res.push_back(path); return ; } if(!index || (nums[index] != nums[index - 1])) start = 0; // 从头开始 for(int i = start; i < nums.size(); i++) { if(!(state>>i & 1)) // 当前位未处理 { path[i] = nums[index]; dfs(nums,index + 1,i + 1,state + (1 << i)); } } }