next_permutation VS prev_permutation(序列的全排列)
阿新 • • 發佈:2018-12-22
C++ STL大法好!!!
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int a[4]={1,2,3,4};
next_permutation(a,a+4);
cout<<a[0]<<" "<<a[1]<<" "<<a[2]<<" "<<a[3]<<endl;
return 0;
}
//cout 1 2 4 3
該段程式碼意思為求1,2,3,4的全排列。
next_permutation(a,a+4)
即求括號中內容的下一個排列。如:a[4]={1,2,3,4}.next_permutation(a,a+4) 即為1,2,4,3.
函式原型:
若為4,3,2,1.next_permutation的返回值即為false,因為沒有下一個排列。但是經過一次函式呼叫之後會變為1,2,3,4.
與之相對的還有一個函式為prev_permutation() 顧名思義,該函式為求上一個排列。
百度百科中的解釋如下:
next_permutation函式將按字母表順序生成給定序列的下一個較大的排列,直到整個序列為降序為止。prev_permutation函式與之相反,是生成給定序列的上一個較小的排列。二者原理相同,僅遍例順序相反
問題:如何求一個數組的下一個排列?
假設該陣列為3 6 4 2.下一個排列應為 4 2 3 6.
過程:對於一個任意序列,最小的排列是增序,最大的為減序。
從最後一位向前看,首先得到的是2,單純的一個數不需要進行交換。
然後得到的是 4 2,4大於2,在這個子序列中已經為最大序列,無法排出更大的序列了。
然後得到的是 6 4 2,原理同上。
之後得到的是 3 6 4 2,此時由於3小於6且小於4,而 3 6 4 2的下一個排列應為比3 6 4 2這個排列大的排列中最小的那個,所以3應該和4進行交換,此時該排列變為 4 6 3 2.此時4位於首端,所以之後的序列應為最小序列,即 2 3 6.綜上,最終結果應為 4 2 3 6.
一道經典題,感受下STL大法好
看這簡潔的程式碼:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int a[10005];
int main(){
int n, m;
cin >> n >> m;
for(int i = 0; i < n; i++){
scanf("%d",&a[i]);
}
for(int i = 0; i < m; i++){
next_permutation(a,a + n);
}
for(int i = 0; i < n; i++){
printf("%d ",a[i]);
}
return 0;
}