java 实现next_permutation()

c++ STL中的next_permutation方法,求一下个字典序,
实现过程:

  1. 从后往前找第一个后一项大于前一项的数num[i]>num[i-1]
  2. 以i-1 为基准,从后往前找第一个大于num[i-1]的数,记做num[j],然后交换这两个数
  3. 将 i-1 后面的数全部翻转
  4. 参考博客: 参考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)) ; 
	
	}
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值