题目 从值为1-n的整数中选取m个数的所有组合并输出 思路 选择第i(m <=i1,则重复1、2步骤 代码 public static void C(int n,int m,int[] a,int[] b){ for(int i = m;i 1){ C(i-1,m-1,a,b); }else { for(int j=0;j < b.length;j++){ System.out.printf("%d ",a[b[j]]); } System.out.println(); } 《剑指Offer》是一本非常经典的面试准备书籍,其中涵盖了大量关于算法和数据结构的问题。在本题中,我们面临的任务是从1到n的整数中选取m个数,并输出所有可能的组合。这是一个典型的组合问题,也被称为“组合枚举”。 我们需要了解组合的基本概念。组合是不考虑顺序的集合,比如从数字1到5中选取3个数,{1, 2, 3}、{1, 2, 4}、{1, 3, 5}等都是合法的组合。与之相对的是排列,排列是考虑顺序的,例如{1, 2, 3}和{2, 1, 3}是不同的排列。 解决这类问题,通常可以采用回溯法或递归策略。代码中提供的方法`C(int n, int m, int[] a, int[] b)`就是基于递归实现的。这里,n表示总数,m表示需要选取的数目,a是原始数组,b是用于存储当前组合的临时数组。 函数的核心在于一个嵌套循环的结构: 1. 外层循环 `for(int i = m; i > 0; i--)`:从m开始递减,每次减少1,代表我们在选择下一个元素时,可以选择的范围会变小。当i等于0时,说明所有m个数已经选择完毕,此时我们可以打印出当前的组合。 2. 内层循环 `for(int j = 0; j < b.length; j++)`:遍历b数组,打印出每个选中的元素。因为b数组存储了当前组合的下标,所以通过`a[b[j]]`可以获取到实际的数值。 在递归部分,有以下两种情况: - 如果i大于1,说明还有更多的数需要选择,我们调用`C(i-1, m-1, a, b)`,将i减1,m也减1,继续寻找下一个元素。 - 如果i等于1,意味着已经到了最后一个元素,这时我们不再进行递归,而是遍历b数组并打印所有已选择的数,然后换行。 在`main`函数中,我们首先读取用户输入的n和m,初始化一个包含1到n的数组a,然后调用`C(n, m, a, b)`开始计算所有的组合。 这个算法的时间复杂度是O(n!) / (m!(n-m)!), 因为总共有n!种排列,但每一种排列有m!/(n-m)!种相同的组合。空间复杂度是O(m),因为我们需要存储m个选择的元素。 该算法有效地解决了从n个数中选取m个数的所有组合的问题,通过递归的方式避免了重复计算,实现了高效且准确的组合枚举。在实际编程面试中,理解和掌握这种算法是非常重要的,因为它不仅出现在组合问题中,还能应用于其他许多领域,如图论、搜索等。



























- 粉丝: 6
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- Java课程设计方案报告-酒店客房管理系统.doc
- 各国强化工业互联网战略标准化成重要切入点.docx
- ANSYS有限元软件建模基础.ppt
- 互联网+对高职学生思想政治教育的影响及其应对探析.docx
- 地铁弱电系统IP网络分配建议方案.docx
- 基于虚拟现实技术的网络会展发展展望.docx
- 数学物理化学生物地理常用软件介绍.doc
- 通信行业发展情况分析-行业集中度整体趋势上行.docx
- 大学设计方案松下FPC型PLC实现交通灯控制大学方案.doc
- 单片机乳化物干燥过程控制系统设计方案.docx
- 物联网工程专业C++程序设计教学改革探索.docx
- 单片机研究分析报告路抢答器.doc
- PLC控制的生活给水泵系统设计.doc
- 非授权移动接入在GSM网络应用中的安全分析.docx
- 2019年二级建造师建设工程项目管理精品小抄.doc
- 《数据库系统》教学设计.doc


