面试或笔试中,多次遇到以下4个关于排列组合的手撕算法,这里做个笔记,方法日后查阅:
1. 无重复元素的数组,求全排列;
2. 有重复元素的数组,求全排列;
3. 无重复元素的数组,求组合【子集】;
4. 有重复元素的数组,求组合;
以上四类题,可以用统一的模板实现,如下所示:

/**【组合&&排列】*把一个数组里的数组合全部列出,比如1和2列出来为1,2,12,21.*这个题目可以扩展成四个:*1.无重复数字的数组,求组合*2.有重复数字的数组,求组合*3.无重复数字的数组,求全排列*4.有重复数字的数组,求全排列*【通用思路(递归)】:*定义一个函数:从候选集candicate中选取一个组合prefix*每次从候选集candicate中remove一个数,并加入前缀prefix,打印prefix;*再递归从新的candicate中remove下一个数,并加入prefix*【对于重复的控制】*采用hashset保存prefix,打印之前,判断hashset中是否包含当前生成的prefix,*没有则打印,并加入hashset;有则不打印*【组合--》排列】*只需在打印前加一个判断:若候选集candicate为空,表示遍历完一次,生成一个排列,可打印*/package xh.offer.practice;import java.util.Arrays;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;public class listAllGroup{public static void main(String[] args) {String [] array = {"1","2"};String [] repeate = {"1","2","1"};listAllGroup test = new listAllGroup();System.out.println("**********no repeate list*******");test.listAllNoRepeate(Arrays.asList(array),"");//初始化prefix = ""System.out.println("**********repeate list*******");HashSet<String> noRepeateSet = new HashSet<String>();test.listAllRepeate(Arrays.asList(repeate), "", noRepeateSet);System.out.println("**************no repeate premutation********************");test.premutationNoRepeate(Arrays.asList(array),"");System.out.println("*********************repeate premutation**********************");HashSet<String> repeateSet = new HashSet<String>();test.premutationRepeate(Arrays.asList(repeate),"", repeateSet);}//无重复的组合public void listAllNoRepeate(List<String> candicate,String prefix){ if(prefix.length() != 0)System.out.println(prefix);//结果长度不为0,则打印输出该组合for(int i = 0;i < candicate.size();i++){//将list转换成linklist链表,方便操作List<String> tempList = new LinkedList<String>(candicate);//templist减少一个数字,并暂存templist中去除的数字String tempString = (String) tempList.remove(i);//递归listAllNoRepeate(tempList,prefix + tempString);}}//有重复的组合,加入hashsetpublic void listAllRepeate(List<String> candicate,String prefix,HashSet<String> res){if(prefix.length() != 0 && !res.contains(prefix)){System.out.println(prefix);res.add(prefix);}for(int i = 0;i < candicate.size();i++){List<String> tempList = new LinkedList<String>(candicate);String tempString = tempList.remove(i);listAllRepeate(tempList, prefix+tempString, res);//递归}}//无重复的全排列,加入判断candicate.size() == 0public void premutationNoRepeate(List<String> candicate,String prefix){if(candicate.size() == 0){System.out.println(prefix);}for(int i = 0;i < candicate.size();i++){List<String> tempList = new LinkedList<String>(candicate);String tempString = tempList.remove(i);premutationNoRepeate(tempList,prefix+tempString);}}//有重复的全排列,加入hashset辅助判断输出public  void premutationRepeate(List<String> candicate,String prefix,HashSet<String> res) {if(candicate.size() == 0 && !res.contains(prefix)){System.out.println(prefix);res.add(prefix);}for(int i = 0;i < candicate.size();i++){List<String> tempList = new LinkedList<String>(candicate);String tempString = tempList.remove(i);premutationRepeate(tempList, prefix+tempString, res);}   }}

java排列组合问题汇总【经典】相关推荐

  1. java 数组的排列组合_java数组排列组合问题汇总

    面试或笔试中,多次遇到以下4个关于排列组合的手撕算法,这里做个笔记,方法日后查阅: 1. 无重复元素的数组,求全排列: 2. 有重复元素的数组,求全排列: 3. 无重复元素的数组,求组合[子集]: 4 ...

  2. java排列组合二维数组_JavaScript 二维数组排列组合2

    二维数组排列组合 var arrays = [ [ '1-1-雨尘', '1-2-芸芸', '1-3-简一', '1-4-乐乐' ] , [ '2-5-小明', '2-6-花花', '2-7-数数' ...

  3. java排列组合(递归算法)

    一.排列 1.计算公式如下: 2.使用方法,例如在1,2,3,4,5中取3个数排列: 3.全排列 当m=n时,结果为全排列.例如1,2,3,4的全排列如下: 4.代码实现求无重复数组的全排列 /*** ...

  4. java 排列组合_java 高效率的排列组合算法(java实现)

    package BeanUtil; import java.util.ArrayList; import java.util.List; import com.work.core.exception. ...

  5. 数组排列组合算法汇总

    求数组全排列(不包含或者包含重复元素) 求数组所有组合(相当于求集合的所有子集,不包含或者包含重复元素) 从n个数中选择k个的组合(不包含重复元素) 从n个数中选择k个的组合(包含重复元素) [版权声 ...

  6. java排列组合算法优缺点,一招彻底弄懂!

    一. 为什么使用spring cloud alibaba 很多人可能会问,有了spring cloud这个微服务的框架,为什么又要使用spring cloud alibaba这个框架了? 最重要的原因 ...

  7. 蓝桥杯 笔记整理【JavaB组省赛真题、约数、全排列模板、排列组合、等差等比求和公式、eclipse快捷键、集合、快速求a^n、进制转换(Integer、BigInteger)、动态数组Vector】

    蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:大部 ...

  8. java 获取排列组合_Java获得一个数组的指定长度排列组合算法示例

    本文实例讲述了Java获得一个数组的指定长度排列组合算法.分享给大家供大家参考,具体如下: package demo; import java.util.Stack; /** * JAVA获得一个数组 ...

  9. java 字符串排列组合_Java 程序计算列出字符串的所有排列组合

    Java 程序计算列出字符串的所有排列组合 在此示例中,我们将学习计算Java中字符串的所有排列组合. 要理解此示例,您应该了解以下Java编程主题: 字符串的排列是指可以通过互换字符串字符的位置来形 ...

最新文章

  1. 如何在C#中用单个空格替换多个空格?
  2. 【机器视觉】 continue算子
  3. 禅道——需要我们斟酌
  4. python 怎么判断字符串是否有换行_JAVA中如何判断一个字符串是否换行
  5. centos7安装rabbitmq简单方式
  6. alwayson高可用组_AlwaysOn可用性组–好奇心使您的工作更轻松–第2部分
  7. iis绑定php程序应用池设定,什么是IIS应用程序池以及应用程序池详解
  8. matlab练习程序(图像放大/缩小,双立方插值)
  9. JAX-RS 2.0 REST客户端编程实例
  10. 2021科技圈十大事件盘点
  11. Python转义字符及用法
  12. 20165107 网络对抗技术 Exp4 恶意代码分析
  13. ozip解密_【ozip转换解包】ROM制作工具已适配机型列表,全网最全!
  14. RT9193稳压芯片的电路原理图
  15. 认知决定你的格局和财富差距
  16. 八字计算方法 php,php计算四柱(生辰八字)的方法
  17. Python开发-- Lesson 1--Python介绍和入门(2016/07/23)
  18. 新能源汽车行业研究报告
  19. Unix操作系统的优点总结
  20. 如何在html中选择wrap,jQuery wrap()方法怎么用?

热门文章

  1. 计算机配置时间怎么查,怎么看自己电脑的配置是哪一年的?
  2. Leaflet中实现矩形闪烁动画效果
  3. 图像处理(Image Processing) ---------- 直方图均衡化 (Equalization)(C#实现)
  4. android调用系统照相机保存照片以及压缩上传下载
  5. 百度网盘妥协了 简单设置即可提速好几倍的p2p上传技术 无需插件破解
  6. “三板斧”“菜鸟”维修硬盘
  7. medoo连接mysql_Medoo简介:初始化方法及调用说明
  8. 0英文基础 学c语言 词典,C语言课设之英文词典排标准系统
  9. Github北极代码库贡献者
  10. 【区块链技术工坊22期实录】王登辉:BANCOR算法详解及代码实现