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]); } } }