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

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

參考: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;//此次增加結束后就退出循環去輸出結果
				}
			}
		}
	}


给定n个数{1,2,…n},从中选取任意两两不同的k个数,请编写程序输出所有的可能选择,要求不重不漏 阅读详情

相关推荐

从N个整数中选择K个数

一、问题 给定N个整数(可能有负数),从中选择K个数,使得这K个数之和恰好等于一个给定的整数X; 如果有多种方案,选择它们中元素平方和最大的一个。数据保证这样的方案唯一。 例如,从4个整数{2,3,3,4}中选择2个数,使它们的和为6,显然有两种方案{2,4}与{3,3},其中平方和最大的方案为{2,4}。 二、算法实现 //从n个数中选k个数使得和为x //若有多个方案选...

Curtis’Blog 2953

C/C++面试题系列之3:输出1-N个数

题目:用C/C++计算1+2+3+……N 条件: 1.不使用任何循环语句。(for,while,goto等等) 2.不使用任何条件语句。(if,?:等等) 3.不使用*/等运算,只使用+-运算  4:更不能写1000个printf或是cout。    一看到这个题,人们会想到递归,但是递归需要结束条件,题目要去不要任何判断条件,所以不行。 例一:变相的用1000个p

likun_tech的专栏 1151

JAVA算法:给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数组合(JAVA)

JAVA算法:给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数组合(JAVA) 给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数组合。、 当 n = 4 ,k = 2 时; 结果为:[[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]] 算法设计 package com.bean.algorith...

梅森上校的博客 业精于勤荒于嬉,形成于思毁于随。 3405

找出一堆数据中最小的K个数问题

题目:输入n个整数,输出其中最小的k个。 例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。 分析:这道题最简单的思路莫过于把输入的n个整数排序,这样排在最前面的k个数就是最小的k个数。只是这种思路的时间复杂度为O(nlogn)。我们试着寻找更快的解决思路。 我们可以开辟一个长度为k的数组。每次从输入的n个整数中读入一个数。如果数组中已经插入的元

cike211的专栏 1047

《算法笔记》学习日记——8.1 深度优先搜索(DFS)

目录8.1 深度优先搜索(DFS)问题 A: 【递归入门】全排列问题 B: 【递归入门】组合输出问题 C: 【递归入门】组合+判断素数问题 D: 【递归入门】n皇后 问题(原始的8皇后问题)问题 E: 【递归入门】出栈序列统计问题 F: 【递归入门】走迷宫小结 8.1 深度优先搜索(DFS) Codeup Contest ID:100000608 问题 A: 【递归入门】全排列 题目描述 排列与...

一只奋斗中的本科生 672

Python - 返回 1:n 中所有可能的 k 个数组合

一.引言 给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数组合。 示例: 输入: n = 4 k = 2 输出: [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4]] n=4 代表待组合 list = [1,2,3,4] 二.递归调用 1.方法参数 combine 为主方法,getCombine 为实际递归调用的方法,主要有5个参数: res[list] : 保存存储结果 prefix[lsit] : 保存当前前缀 n : 给定数字,代表

BITDDD小栈 3790

从N个数选取k个数组合--不降原则(DFS)

从N个数中选取k个数–不降原则(DFS) 原理 :不降原则(看代码前先看一下原理吧) 举个例子: 比如说在6里面随便选5个数,那么选法都是什么呢? 瞎枚举? 12345 12346 前两个还不会弄混 然后很可能就乱了 少点数可能不会乱 但是多了就不好整了 比如说在100里随便选50个数1 2 3 4 5 6 7 8 9 10 11 12… 所以我们可以运用不降原则: 保证枚举的这些数是升序排列...

lhc121386的博客 1万+

数组中任意n个数的全排列(DFS)以及任意n个数组合

今天做了poj1270这道题,采用了深度优先搜索,确实启发了我,无意中想了一个这么一个问题:求数组中任意n个数的全排列是不是也可以用深度优先去搜索(我理解这是一种深度搜索,不知道对不对)。 代码如下: #include #include using namespace std; #define MAX 20 vectorindex; int visited[MAX]={0}; void

继续微笑lsj 5085

给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数组合

/*给定两个整数n和k,返回 1 ...n中所有可能的k个数组合。*/ /* 示例: 输入:n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ] */ vector<vector<int>>combine(intn,intk){ dfs(temp,n,k,0); returnres; } ...

m0_47575628的博客 2801

给定n个数{1,2,3,...,n},从中选择任意两两不同的k个数输出所有可能组合

如题,给定n为5,则这n个数为{1,2,3,4,5},给定k为2, 则所有的可能组合为: {1,2}、{1,3}、{1,4}、{1,5}、{2,3}、{2,4}、{2,5}、{3,4}、{3,5}、{4,5} 而且我们经常是按照这种顺序来寻找所有的可能性,那么如何按照这个逻辑编程实现呢? 从上面的序列中,我们可以发现,相邻的两个数是有一定的关系的, 例如以1开头的组合中,第二个数字是递增

学习天地 8822

组合数:求n个数1...n)中k个数组合

如:combination(5,3) 要求输出:543,542,541,532,531,521,432,431,421,321 递归,当k等于1的时候进行输出, 当第一个数选的5,则从剩下的4321中选2个数,即combination(4,2) 第二个数选的4,则从剩下的321中选1个数,即combination(3,1),输出543,542,541 第二个数选的3,则从...

扮猪吃老虎二号的博客 1815

找出所有可能的k个数字的组合,加起来为n,因为只能使用1到9的数字,而每个组合应该是唯一的一组数字

找出所有可能的k个数字的组合,加起来为n,因为只能使用1到9的数字,而每个组合应该是唯一的一组数字。注意:所有的数字都是正整数。该解决方案集不能包含重复的组合。例1:输入: k = 3,n = 7 输出: [[1,2,4]]例2:输入: k = 3,n = 9 输出: [[1,2,6],[1,3,5],[2,3,4]]约束:1.不能重复;2.组合内元素升序排列用回溯法首先先找第一个数再找下一个并且...

expanding_circle的博客 3423

从n个数中选出k个数

从n个数中选出k个数 #include <iostream> #include <vector> #include <algorithm> using namespace std; vector<int> a; vector<int> b; void fun(int a) { cout << a << " "; ...

你听我说,在这个地方你这样做,才是对的。 2761

给定整数n和k,输出1到n的所有可能的k个数字的组合

public class Combinations { public Combinations(){} public List<List<Integer>> combine(int n, int k) { List<List<Integer>> result= new ArrayList<List<Integer>>();...

gz9876543210的博客 1922

【回溯】【leetcode】返回 1 ... n 中所有可能的 k 个数组合

题目: 给定两个整数n和k,返回 1 ...n中所有可能的k个数组合。 例: 输入:n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ] 来源: 77. 组合 解题思路:回溯 想用暴力搜索解决,但还是无从下手,这时我们采用回溯的办法解决。 回溯配合递归使用,递归前访问,递归后回溯。访问与回溯是一对相反操作。 代码一: class Solution { public: ...

xiaoshe的专栏 1617

【数据结构与算法】之N个数中有K个数可能组合算法

给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数组合。 一、题目要求 输入: n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ] 二、算法示例 Swift var res = [[Int]]() func bt(_ n:Int, _ count:Int, _ t:[Int]){ let tLen = t.count if tLe

╰つ栺尖篴夢ゞ 957

给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数组合

这是一个典型的组合生成问题,可以使用回溯算法来解决。回溯算法是一种通过穷举所有可能情况来找到所有解的算法。对于这个问题,我们从数字 1 开始,依次尝试将每个数字加入到当前组合中,如果当前组合的大小等于 k,则将其加入结果列表中。然后,我们通过递归调用回溯函数,不断尝试新的数字,直到找到所有可能组合

nalanqingcheng1314的博客 1084

数学归纳法证明从N个数中取三个数不同组合的总数为N(N-1)(N-2)/6

设P(n)为命题:从n个数中取三个数不同组合的总数为n(n−1)(n−2)6\frac{n(n-1)(n-2)}{6}6n(n−1)(n−2)​。 基础步骤: P(3)为真,因为只有1组合,而 3∗(3−1)∗(3−2)6=1\frac{3*(3-1)*(3-2)}{6} = 163∗(3−1)∗(3−2)​=1。 归纳步骤: 归纳假设对正整数k > 3,P(k)为真。即假定从k个数中取...

Ingsuifon的博客 3540
上一篇: 单例模式
下一篇: 计算N的阶乘(大数)
老萨
博客等级 码龄15年 14粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值