c++ STL中的next_permutation方法,求一下个字典序,
实现过程:
- 从后往前找第一个后一项大于前一项的数num[i]>num[i-1]
- 以i-1 为基准,从后往前找第一个大于num[i-1]的数,记做num[j],然后交换这两个数
- 将 i-1 后面的数全部翻转
- 参考博客: 参考1 、 参考2
import java.util.*;
public class Main {
public static void reverse(int a,int b,int[] num) {
while(a<b) {
int t=num[a]; num[a]=num[b] ; num[b]=t ;
++a ; --b ;
}
}
public static boolean next_permutation(int a,int b,int[] num) {
int i=b-1 ;
while(i>a&&num[i]<=num[i-1]) --i ; //从后往前找第一个后一项大于前一项的
if (i==a) return false ; //到头说明整个序列为逆序,没有下一个字典序了
--i ;
int j=b-1 ;
while(j>i&&num[j]<=num[i]) --j ; //从后往前找第一个大于num[i]的数
int t=num[i]; num[i]=num[j]; num[j]=t ; //交换两个数
reverse(i+1,b-1,num) ; //i后面的数翻转
return true ;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in) ;
int[] num = {1,2,3,4} ;
do {
for(int i=0 ; i<num.length ; ++i) System.out.print(num[i]+" ");
System.out.println();
}while(next_permutation(0,num.length,num)) ;
}
}