题目:
给定一个可包含重复数字的序列,返回所有不重复的全排列。
示例:
输入: [1,1,2] 输出: [ [1,1,2], [1,2,1], [2,1,1] ]
解题思路:
与上一题相比,这题多了一个无重复条件。那即在上一题的基础上加上去重处理即可。
去重办法:
首先,为了判别存在重复的数字,我们可以让重复的数字紧靠在一起,这样就可以用 if(nums[i] == nums[i-1]) 这样的方法来判重。那怎么让重复的数字紧靠在一起呢? 使用sort从小到大排序。
然后,使用上述的判重语句,并且只保留一个循环。
注意:判重那行代码中 visited[i-1] == 0 的含义,为1时代表目前只有一个这样的排列,即第一个(1、1、2),我们只保留第一个。
代码:
1 class Solution { 2 public: 3 vector<vector<int>> permuteUnique(vector<int>& nums) { 4 vector<vector<int>> ans; 5 vector<int> out; 6 vector<int> visited(nums.size(), 0); 7 sort(nums.begin(), nums.end()); 8 perDFS(nums,0,visited,out,ans); 9 return ans; 10 } 11 void perDFS(vector<int> nums, int lever, vector<int> &visited, vector<int> &out, vector<vector<int>> &ans) { 12 if(lever == nums.size()){ 13 ans.push_back(out); 14 return ; 15 } 16 for(int i=0; i<nums.size(); ++i){ 17 if(visited[i]) 18 continue; 19 if(i>0 && nums[i] == nums[i-1] && visited[i-1]==0) continue; //判重 20 visited[i] = 1; 21 out.push_back(nums[i]); 22 perDFS(nums,lever+1,visited,out,ans); 23 out.pop_back(); 24 visited[i] = 0; 25 } 26 } 27 };
原文地址:https://www.cnblogs.com/moxiangfeng/p/10674351.html
时间: 2024-11-08 20:03:02