import java.util.ArrayList;/***   组合算法*    本程序的思路是开一个数组,其下标表示1到m个数,数组元素的值为1表示其下标*    代表的数被选中,为0则没选中。*    首先初始化,将数组前n个元素置1,表示第一个组合为前n个数。*    然后从左到右扫描数组元素值的“10”组合,找到第一个“10”组合后将其变为*    “01”组合,同时将其左边的所有“1”全部移动到数组的最左端。*    当第一个“1”移动到数组的m-n的位置,即n个“1”全部移动到最右端时,就得*    到了最后一个组合。*    例如求5中选3的组合:*    1   1   1   0   0   //1,2,3*    1   1   0   1   0   //1,2,4*    1   0   1   1   0   //1,3,4      *    0   1   1   1   0   //2,3,4*    1   1   0   0   1   //1,2,5*    1   0   1   0   1   //1,3,5*    0   1   1   0   1   //2,3,5*    1   0   0   1   1   //1,4,5*    0   1   0   1   1   //2,4,5*    0   0   1   1   1   //3,4,5** @author songxh* @create 2022-03-15-11:06*/
public class 解决排列组合问题 {public static void main(String[] args) {int[] arr = {1, 2, 3, 4, 5,6,7};//在这些数里面找出n个数的组合int[] temp = new int[7];int n = 3;//表示那啥结果的位数ArrayList list = new ArrayList();//将temp数组全部赋值0for (int i = 0; i < temp.length; i++) {temp[i] = 0;}//给tem数组初始前 n 个赋值为 1 ;for (int i = 0; i < n; i++) {temp[i] = 1;}boolean flag = true; //while循环的条件boolean flagT;while (flag) {flagT=true;//初始化,便于后面判断是否退出循环int t=0;//用于记录找到 1 0 时 1 的下标int pos=0;//用于记录t下标前有多少个 1list.add(print(arr, temp, n)); //最开始,第一第二第三个数的组合也是其一for (int i = 0; i < temp.length-1; i++) { //遍历数组if (temp[i]==1 && temp[i+1]==0){  //查找为 1 0 的下标并交换成 0 1temp[i]=0;temp[i+1]=1;t=i;//记录此时1 的下标break;}}for (int i = 0; i < t; i++) { //查找 t 前有多少个 1if (temp[i]==1){pos++;}}for (int i = 0; i < t; i++) {//将 t 前的所有 1 移动到最左边if (i<pos){temp[i]=1;}else {temp[i]=0;}}//判断是否全部到达最右边即是否遍历完for (int i = arr.length-n; i < arr.length; i++) {if (temp[i]==0){flagT=false; //若最后 n 位数有为 0 ,则没有遍历完break;}}if (flagT){flag=false; //退出循环}else {flag=true;//如果flagT为false,就继续循环}}//退出循环后,即处于所有 1 都在最右边的状态list.add(print(arr,temp,n));//此状态依旧需要加上//遍历集合for (int i = 0; i < list.size(); i++) {int[] a = (int[])list.get(i);//因为存的数组进去故而需要强转for (int j = 0; j < a.length; j++) {System.out.print(a[j]);}System.out.println();//换行}}private static int[] print(int[] arr, int[] temp, int n) {int[] res=new int[n];int index=0;for (int i = 0; i < temp.length; i++) {if (temp[i]==1){res[index]=arr[i];index++;}}return res;}
}

注释很详细!

超详细排列组合问题解法相关推荐

  1. 算法 64式 17、排列组合算法整理

    1算法思想 排列组合 1.1含义 排列: 含义:从元素列表中取出指定个数的元素进行排序 公式:从n个不同元素中取出m个元素的排列个数=n!/(n-m)! 组合: 含义:从元素列表中取出指定个数的元素, ...

  2. Leetcode 1162:地图分析(超详细的解法!!!)

    你现在手里有一份大小为 N x N 的『地图』(网格) grid,上面的每个『区域』(单元格)都用 0 和 1 标记好了.其中 0 代表海洋,1 代表陆地,你知道距离陆地区域最远的海洋区域是是哪一个吗 ...

  3. Leetcode 37:解数独(超详细的解法!!!)

    编写一个程序,通过已填充的空格来解决数独问题. 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次. 数字 1-9 在每一列只能出现一次. 数字 1-9 在每一个以粗实线分隔的 3x3 ...

  4. Leetcode 1229:安排会议日程(超详细的解法!!!)

    你是一名行政助理,手里有两位客户的空闲时间表:slots1 和 slots2,以及会议的预计持续时间 duration,请你为他们安排合适的会议时间. 「会议时间」是两位客户都有空参加,并且持续时间能 ...

  5. Leetcode 503:下一个更大元素 II(超详细的解法!!!)

    给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它 ...

  6. Leetcode 496:下一个更大元素 I(超详细的解法!!!)

    给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集.找到 nums1 中每个元素在 nums2 中的下一个比其大的值. nums1 中数字 x 的下一个更 ...

  7. Leetcode 739:每日温度(超详细的解法!!!)

    根据每日 气温 列表,请重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高的天数.如果之后都不会升高,请输入 0 来代替. 例如,给定一个列表 temperatures = [73, 74 ...

  8. 详细总结组合排列的十余种算法实现

    目录 •写在前面 •问题引入 •暴力枚举 循环枚举 递归枚举 回溯枚举 •深度优先搜索 前序遍历 中序遍历 后序遍历 •字典序 •二进制位运算 •带重复数字 •总结 •写在前面 排列组合的问题,如果没 ...

  9. Leetcode 29:两数相除(超详细的解法!!!)

    给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 divisor 得到的商. 示例 1: 输 ...

最新文章

  1. 网络优化正在从经验型优化向大数据关联分析优化转变
  2. python学习之散学
  3. oracle 202,Oracle Certification 1Z0-202题库
  4. matlab surf 坐标,Matlab SURF指向像素坐标
  5. webkit如何实现JS DOM binding—基于V8分析
  6. db2数据库日期减一天_DB2 数据库中的日期与时间如何正确操作?(2)
  7. 执行ios命令_MEDUZA:一款针对iOS应用程序的通用SSL解绑工具
  8. centos7如何安装samba-client_Docker: 教程07 - ( 如何对 Docker 进行降级和升级)
  9. 美国旧金山共享单车数据分析
  10. 我的爬虫入门书 —— 《Python3网络爬虫开发实战(第二版)》
  11. vue后端模板、vue登录界面、注册界面(带短信验证码)模板
  12. input输入框添加键盘事件
  13. Java毕设项目-学生档案管理系统
  14. web页在微信中访问增加遮罩层 右上角弹出在浏览器中打开
  15. RK3288[android 7.1]调试笔记 修改默认时区是北京时间
  16. tmux鼠标配置出现错误unknown option: mode-mouse
  17. 世界黄金价格走势,十大香港国际黄金交易平台排行榜
  18. Unity项目-黑魂复刻(三)玩家控制器(跳跃)
  19. 每日一读---补充正能量
  20. C语言的system函数

热门文章

  1. Pygame经典游戏飞机大战,黑马程序员案例讲解
  2. 刷脸支付人脸识别技术是一把双刃剑
  3. 视听说教程(第三版)4 quiz 10
  4. Euclidean Geometry
  5. 无法从商店下载Linux系统,解决win8应用商店不能安装软件并提示“此应用无法安装”的方法...
  6. Cause: java.sql.SQLException: 无效的列类型: 1111
  7. VirtualBox 中运行 CentOS 7 鼠标切换
  8. 【云原生 | 36】Docker快速部署主流脚本语言JavaScript
  9. docusign文档打不开_如何使用DocuSign对文档进行数字签名 | MOS86
  10. VS2008 下编译 live555