1-n,从中选择任意两两不同的k个数,输出所有可能的组合,要求不重不漏

參考:http://blog.csdn.net/hyq666888/article/details/22572695



	/**
	 * 给定n个数{1,2,3,...,n},从中选择任意两两不同的k个数,输出所有可能的组合
	 * 要求不重不漏
	 * 
	 * 思路:
	 * 假如說n=9 k=5的話。
	 * 那最後一個輸出的數字肯定是 5 6 7 8 9
	 * 而且每一輪輸出的最終數字都在 5 6 7 8 9 中
	 * 例如第一輪輸出的 12345-12349 中的9 就在 5 6 7 8 9 中。
	 * 
	 * 所以我們可以每次輸出后,用當前輸出的數字去與 56789中對應的位置去比較,如果相等的話,就說明此輪輸出完畢
	 * 然後就倒退一位繼續比較。倒退后,如果加1 的話,那後面的幾位也要對應的發生改變 如 12789-》13456 其中 456 3個位置就發生了改變
	 * 
	 * 最後如果第一位等於n-k+1的話,輸出就結束了。
	 * 
	 * 參考:http://blog.csdn.net/hyq666888/article/details/22572695
	 * */
	private static void fun1(int n, int k) {
		int arr[]=new int[k];
		int index[]=new int[k];
		
		for(int i=0;i<k;i++){
			arr[i]=i+1;
			index[i]=n-k+i+1;
		}
		
		while(true){
			for(int i=0;i<k;i++)
				System.out.print(arr[i]);
			System.out.println();
			
			//循环终止条件
			if(arr[0]==index[0])
				break;

			//输出一次后,对数组调整
			for(int i=k-1;i>=0;i--){
				if(arr[i]<index[i]){//末尾位不够最终数,加 1 。 false代表。第k位数够了,然后加第k-1位数
					arr[i]++;
					
					//假如是在增加第s位数(s最小可为1)时,第s到k位数要发生变化
					for(int j=i+1;j<k;j++)
						arr[j]=arr[j-1]+1;
					
					break;//此次增加結束后就退出循環去輸出結果
				}
			}
		}
	}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值