LeetCode Permutations I && II

2014-11-24 07:56:25 ¡¤ ×÷Õß: ¡¤ ä¯ÀÀ: 0

Permutations

Given a collection of numbers, return all possible permutations.

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

Permutations II

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].

²»ÓÃÐ޸쬾ÍÁ½¸öÎÊÌâ¶¼ÊÊÓõÄËã·¨£¬µ÷ÓÃSTL¾ÍÐеġ£ÔËÐÐËÙ¶È»¹ÊǺܿìµÄ¡£

class Solution {
public:
    vector
  
    > permuteUnique(vector
   
     &num) { vector
    
      > permu; sort(num.begin(), num.end()); permu.push_back(num); while (next_permutation(num.begin(), num.end())) { permu.push_back(num); } return permu; } };
    
   
  


µ«ÊǸоõ×öÕâЩËã·¨Ì⣬ֱ½Óµ÷ÓÃSTLÊDz»ÊÇÓеã¸Ð¾õÊÇ×÷±×µÄÏÓÒÉ£¬ºÇºÇO(¡É_¡É)O~

ÏÂÃæ¿´¿´²»Ê¹ÓÃSTLÈçºÎ×ö¡£

Permutations:

»ØËÝ·¨£º

´úÂë³ö×ÔÕâ¸öblog£º http://blog.csdn.net/tuantuanls/article/details/8717262

Ö»ÓÐÊÖ¶¯×ß¼¸±é°É£¬¾ÍÄÜÀí½âÁË¡£

Õâ¸öËã·¨ÊÇ×î¼òµ¥µÄÁË

	vector
  
    > ret;
	int N;
	void perm(vector
   
     &num, int i){ if( i == N){ ret.push_back(num); } for(int j = i; j < N; j++){ swap(num[i], num[j]); perm(num, i + 1); swap(num[j], num[i]); } } vector
    
      > permute3(vector
     
       &num) { N = num.size(); ret.clear(); perm(num, 0); return ret; }
     
    
   
  


ÏÂÃæÎÒÓÃÏÈÐò±éÀúÊ÷µÄ˼ÏëдµÄ´úÂ룬»­¸öÊ÷Àí½â¾ÍºÃÁË£º

\

ÈçµÚÒ»´Î±éÀú£º·ÃÎÊabc½Úµã£¬È¡³öa·ÅÈë½á¹ûÖУ¬´Óabd½Úµãµ½·ÃÎÊbc½Úµã£¬·ÃÎʽڵãc£¬°Ñb·ÅÈë½á¹ûÖУ¬×îºó·ÃÎÊc£¬°Ñc·ÅÈë½á¹ûÖУ¬Ã¿Ò»Ìõ·¾¶¾ÍÊÇÒ»¸ö½â£¬ÕâÀï×ܹ²ÓÐ6Ìõ·¾¶£¬¸ÕºÃÊÇÁù¸ö½â¡£±éÀúÍ꣬´ð°¸¾Í³öÀ´ÁË¡£

ºÍÇ°ÃæµÄ»ØËÝ˼ÏëÓÐÒ»µã²î±ð£¬µ«ÊÇ×î»ù±¾Ë¼Ïë²î²»¶àÊÇÒ»Öµģ¬Òª°ÑÕâЩ˼ÏëÈÚºÏÆðÀ´£¬×öµ½ÈÚ»á¹áͨ£¡

//5===============
	vector
  
    > permute5(vector
   
     &num) { vector
    
      mediRes; vector
     
       > res; permu(num, mediRes, res); return res; } void permu(vector
      
        &num, vector
       
         &mediRes, vector
        
          > &ret) { int N = num.size(); if (N == 1) { mediRes.push_back(num[0]); ret.push_back(mediRes); mediRes.pop_back(); return; } for (int i = 0; i < N; i++) { mediRes.push_back(num[i]); vector
         
           cur = num; cur.erase(cur.begin()+i); permu(cur, mediRes, ret); mediRes.pop_back();//×¢Ò⣺±ðÍü¼ÇÁËÕâÀïÐèÒªµ¯³ö£¬²»ÒªµÈµ½Ñ­»·½áÊø } }
         
        
       
      
     
    
   
  


Permutations II

Õâ¸öÎÊÌâÖ÷Òª¾ÍÔö¼Ó·ÀÖ¹ÖØ¸´µÄÅжϾͿÉÒÔÁË¡£

Á½ÖÖ·½·¨£º

1 ʹÓÃsortÅÅÐò£¬È»ºóÅųýÏàÁÚµÄÖØ¸´Êý×Ö¡£×¢ÒâûÅÅÐòµÄ²»¿ÉÒÔÕâôÅжÏ

2 ÀûÓÃÒ»¸öеÄÈÝÆ÷£¬×°ÒѾ­´¦ÀíµÄÊý×Ö£¬²»Öظ´´¦ÀíÊý×Ö£¬ÀûÓÃmapºÍsetµÈ¶¼¿ÉÒÔ¡£

·½·¨Ò»³ÌÐò£º

vector
  
    > permuteUnique2(vector
   
     &num) { mediRes.clear(); res.clear(); sort(num.begin(), num.end()); permuII2(num); return res; } void permuII2(vector
    
      &num) { int m = num.size(); if (m == 1) { mediRes.push_back(num[0]); res.push_back(mediRes); mediRes.pop_back(); return; } //Èç¹ûÒѾ­ÅÅÐòÁ˵ľͿÉÒÔÖµ´¦ÀíÏàÁÚµÄÖØ¸´ÁË for (int i = 0; i < m; i++) { while (i < m-1 && num[i] == num[i+1]) i++; mediRes.push_back(num[i]); vector
     
       cur = num; cur.erase(cur.begin()+i); permuII2(cur); mediRes.pop_back();//×¢Ò⣺±ðÍü¼ÇÁËÕâÀïÐèÒªµ¯³ö£¬²»ÒªµÈµ½Ñ­»·½áÊø } }
     
    
   
  


·½·¨¶þ³ÌÐò£º
vector
  
    > res;
	vector
   
     mediRes; vector
    
      > permuteUnique(vector
     
       &num) { mediRes.clear(); res.clear(); permuII(num); return res; } void permuII(vector
      
        &num) { int m = num.size(); if (m == 1) { mediRes.push_back(num[0]); res.push_back(mediRes); mediRes.pop_back(); return; } //×¢Ò⣺²»ÄܹâÅжÏÏàÁÚµÄÊÇ·ñÖØ¸´£¬²»ÏàÁÚµÄÖØ¸´Ò²»á³öÏÖÖØ¸´½á¹ûµÄ¡£ //ÄÔ×ÓÒª·Å´ó unordered_set
       
         used; for (int i = 0; i < m; i++) { if (used.find(num[i]) == used.end()) { mediRes.push_back(num[i]); vector
        
          cur = num; cur.erase(cur.begin()+i); permuII(cur); mediRes.pop_back();//×¢Ò⣺±ðÍü¼ÇÁËÕâÀïÐèÒªµ¯³ö£¬²»ÒªµÈµ½Ñ­»·½áÊø used.insert(num[i]); } } }