leetcode 47 : Permutations II

96 篇文章 0 订阅
68 篇文章 0 订阅

Given a collection of numbers that might contain duplicates, return all possible unique permutations.

For example,
[1,1,2] have the following unique permutations:
[1,1,2][1,2,1], and [2,1,1].


用递归的时候注意去重,同值的元素只能交换一次,做一次排头  
//递归,去重-交换时同值元素之交换一次,做一次排头
class Solution {
    vector
   
   
    
    
     
      > ret;
    int N;
    
public:
    void perm(vector
     
     
      
       &nums, int i){
        if( i == N){
            ret.push_back(nums);
        }
        set
      
      
       
        setNums;
        for(int j = i; j < N; j++){
            //没有交换过的元素才交换
            if( setNums.find(nums[j])==setNums.end() )
            {
                setNums.insert(nums[j]);
                swap(nums[i], nums[j]);
                perm(nums, i + 1);
                swap(nums[j], nums[i]);
            }
        }
    }

    vector
       
        
        
          > permuteUnique(vector 
         
           & nums) { N = nums.size(); ret.clear(); perm(nums, 0); return ret; } }; //next_permute class Solution { public: //不循环 bool next_permute(vector 
          
            & nums){ if(nums.size()==0||nums.size()==1) return false; vector 
           
             ::iterator itF=nums.end()-2; vector 
            
              ::iterator itS=nums.end()-1; while(true) { if(*itF<*itS) { vector 
             
               ::iterator tmpIt = nums.end()-1; while(*tmpIt<=*itF) tmpIt--; int tmp=*itF; *itF=*tmpIt; *tmpIt=tmp; break; } if(itF==nums.begin()) { return false; } itF--; itS--; } reverse(itS,nums.end()); return true; } vector 
               
               
                 > permuteUnique(vector 
                
                  & nums) { vector 
                  
                  
                    > ret; sort(nums.begin(),nums.end()); ret.push_back(nums); while(next_permute(nums)) ret.push_back(nums); return ret; } }; 
                   
                  
                 
                
               
              
             
            
           
          
         
       
      
      
     
     
    
    
   
   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值