next permutation()學習總結

2021-09-12 02:39:22 字數 2134 閱讀 9938

例題

ray又對數字的列產生了興趣:

現有四張卡片,用這四張卡片能排列出很多不同的4位數,要求按從小到大的順序輸出這些4位數。

input

每組資料佔一行,代表四張卡片上的數字(0<=數字<=9),如果四張卡片都是0,則輸入結束。

output

對每組卡片按從小到大的順序輸出所有能由這四張卡片組成的4位數,千位數字相同的在同一行,同一行中每個四位數間用空格分隔。

每組輸出資料間空一行,最後一組資料後面沒有空行。

sample input

1 2 3 4

1 1 2 3

0 1 2 3

0 0 0 0

sample output

1234 1243 1324 1342 1423 1432

2134 2143 2314 2341 2413 2431

3124 3142 3214 3241 3412 3421

4123 4132 4213 4231 4312 4321

1123 1132 1213 1231 1312 1321

2113 2131 2311

3112 3121 3211

1023 1032 1203 1230 1302 1320

2013 2031 2103 2130 2301 2310

3012 3021 3102 3120 3201 3210

#include#include#include#include#includeusing namespace std;

#define n 4

int a[n];

int main()。

這個序列有六個可能的排列組合:abc,acb,bac,bca,cab,cba。這些排列組合根據less-than操作符做字典順序(lexicographical)的排序。也就是說,abc名列第一,因為每乙個元素都小於其後的元素。acb是次乙個排列組合,因為它是固定了a(序列內最小元素)之後所做的新組合。

同樣道理,那些固定b(序列中次小元素)而做的排列組合,在次序上將先於那些固定c而做的排列組合。以bac和bca為例,bac在bca之前,因為次序ac小於序列ca。面對bca,我們可以說其前乙個排列組合是bac,而其後乙個排列組合是cab。序列abc沒有「前乙個」排列組合,cba沒有「後乙個」排列組合。next_permutation()會取得[first,last)所標示之序列的下乙個排列組合,如果沒有下乙個排列組合,便返回false;否則返回true。

1 #include2 #include3 using namespace std;

4 int main()

5 ;7 sort(ans,ans+4); /* 這個sort可以不用,因為已經排好序*/

8 do /*注意這步,如果是while迴圈,則需要提前輸出*/

9 ;

do

{ cout結果

當我們把while(next_permutation(num,num+3))中的3改為2時,輸出就變為了:

由此可以看出,next_permutation(num,num+n)函式是對陣列num中的前n個(這裡只是對「1「,」2」兩個元素進行全排列,同時並改變num陣列的值。

另外,需要強調的是,next_permutation()在使用前需要對欲排列陣列按公升序排序,否則只能找出該序列之後的全排列數。比如,如果陣列num初始化為2,3,1,那麼輸出就變為了:

此外,next_permutation(node,node+n,cmp)可以對結構體num按照自定義的排序方式cmp進行排序。也可以對字串。

stl演算法 next permutation剖析

在標準庫演算法中,next permutation應用在數列操作上比較廣泛.這個函式可以計算一組資料的全排列.但是怎麼用,原理如何,我做了簡單的剖析.首先檢視stl中相關資訊.函式原型 template boolnext permutation bidirectionaliterator first...

next permutation原理剖析

最近刷leetcode的時候遇見next permutation這道題,感覺挺有意思的乙個題目,遞迴的方法是較簡單並且容易想到的,在網上搜了其餘的解法,就是std next permutation非遞迴解法,但是讓人不是很舒服的就是關於原理的部分,千篇一律的都是摘抄 stl原始碼剖析 也就是這樣的。...

演算法 Next Permutation問題》

此問題描述如下 給定乙個陣列,首先從後向前找出最長的遞減序列的前乙個元素,比如陣列中,從後向前最長遞減序列是,這個序列的前乙個元素就是4,然後再遞減序列中找到最後乙個比這個數 4 大的數字 就是5 然後將5與4交換,得到新的陣列,然後將交換過後的遞減序列進行翻轉,最後得到的結果就是。如果陣列單調遞減...