給定乙個乙個序列,輸出他的全排列
比如.全排列就是:
1,2,3
1,3,2
2,1,3
2,3,1
3,1,2
3,2,1
可以先看乙個例子。
給定乙個序列輸出下乙個比它大的序列
例如:arr
比它大的下乙個排列就是
具體怎麼做的?
1.從arr.len-1位置到0開始找arr[i]>arr[i-1].找到之後,將i-1位置的數記住ind1;沒找到則說明這個序列沒有下乙個比它大的序列。
2.從arr.len-1位置到i-1位置開始找arr[i]>ind1的數。講這個數記做ind2。
3.將ind1和ind2交換。
4.將i位置和arr.len-1位置的元素排序或者逆序。
例子演示:
1.先找到ind1就是3,它的下標是2,i下標就是3.
2.在找到ind2就是4。
3.將ind1和ind2交換。
4.將3位置和arr.len-1位置的元素排序或者逆序。
比它大的下乙個排列就是。
bool
nextpermutation
(vector<
int>
& nums)
swap
(nums[i-1]
,nums[j]);
sort
((nums.
begin()
+i),nums.
end())
;return
true;}
}if(i==0)
return
false
;}
其實c++的標頭檔案中有乙個方法就是我們上面實現的這個,叫做next_permutation(begin(),end()),它的返回值為bool型別,true表示找到,false表示找不到!
接下來再看全排列問題就容易多了,其實就是將序列sort為最小,然後求出它的所有下乙個更大的排列。
庫函式實現全排列:
#include
#include
#include
using
namespace std;
intmain()
;sort
(v.begin()
,v.end()
);dowhile
(next_permutation
(v.begin()
, v.
end())
);return0;
}
應用咱們自己寫的方法實現全排列:
class
solution
swap
(nums[i-1]
,nums[j]);
sort
((nums.
begin()
+i),nums.
end())
;return
true;}
}return
false;}
public
: vector
int>>
permuteunique
(vector<
int>
& nums)
while
(nextpermutation
(nums));
return ret;}}
;
結果:
ps:這個方法同樣適用於求含有重複數的全排列哦!
2.全排列
3.全排列ii
參考部落格:
全排列問題
一 全排列問題演算法描述如下 舉例 345的全排列分別為 345 354 435 453 534 543,可見將整組數中的所有的數分別與第乙個數交換,這樣就總是在處理後n 1個數的全排列。又舉例 45的全排列有 45 54 可見將第乙個數分別與後面的數交換後輸出即為45的全排列。所以,對於乙個很長一...
全排列問題
題目描述814 全排列問題 鍵盤輸入n 1 n 10 個字元,輸出輸出其全排序。第一行為字元個數k,第二行為k個字元,不用空格隔開。輸出其每種排列佔一行,各字元間用一空格隔開。樣例輸入 3abc 樣例輸出 a b c a c b b a c b c a c b a c a b includeint ...
全排列問題
全排列就是從第乙個數字起 每個數分別與它後面的數字交換 用c 寫乙個函式,如 foo const char str 列印出 str 的全排列,如 abc 的全排列 abc,acb,bca,dac,cab,cba。第一種方法 用遞迴 不包含有重複數字或字元出現的情況 void swap char a,...