求一个数组的全排列(java)
示例:
arr = {1,2,3}
输出: 1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
(输出结果没有顺序, 但每个元素不能重复)
题解:
使用 回溯算法 ,将它转换为一个 树 的结构, 然后 每个节点都可以 与 数组(比如arr = {1,2,3})中的元素进行组合,只要组合的个数达到 数组 的长度,就是一种组合方法(这个过程中需要进行去重)
代码:
/*** 求出一个数组的全排列* @param args*/public static void main(String[] args) {int[] arr = {1,2,3};int len = arr.length;//用来存放 全部 的排列 结果,每一个结果都是一个 List<Integer>List<List<Integer>> list = new ArrayList<>();//用来存放 每一组 排列 的数据Stack<Integer> stack = new Stack<>();//用来记录 arr 数组中每个值的 状态:是否已经被使用boolean[] used = new boolean[len];//回溯算法(深度优先遍历)dfs(arr,len,0,stack,used,list);System.out.println(list);}/*** 回溯算法(深度优先算法)* @param arr 需要全排列的数组* @param len 数组的长度* @param depth 用来记录递归到第几层* @param stack 用来存放每一组的数据* @param used 用来记录每个数据是否使用* @param list 存放所有的 排列的情况*/private static void dfs(int[] arr, int len, int depth, Stack<Integer> stack, boolean[] used, List<List<Integer>> list) {//递归结束条件:当前深度 == 数组的长度if(depth == len) {//将已经放好的一组数据放入 listlist.add(new ArrayList<>(stack)); //注意这里使用 新的 对象,因为递归 回溯会到 根节点(根节点是一个空节点)return;}//每一次递归进来,都会从整个数组中找元素for(int i = 0; i < len; i++) {//先判断当前元素是否已经被放入 stack 中if(used[i] == true) {//找下一个continue;}//没有就放入 stack 中stack.push(arr[i]);//更改当前元素的 状态used[i] = true;//开始递归dfs(arr,len,depth+1,stack,used,list);//注意:当这里 回溯 回来之后,我们就需要 进行 逆操作(这一步至关重要)//删除上面添加的 stack 中的值stack.pop();//更新状态used[i] = false;}}
运行结果:
求一个数组的全排列(java)相关推荐
- java 最大子数组_求一个数组中子数组的最大和算法(Java实现)
前几天在微信订阅号"待字闺中"中看到的一篇文章<小技巧求一个数组中子数组的最大和>,提供下Java的实现,并且在对题目做下小修改,本来打算直接在微信里直接回复,但是发现 ...
- 求一个数组的最大k个数(java)
问题描述:求一个数组的最大k个数,如,{1,5,8,9,11,2,3}的最大三个数应该是,8,9,11 问题分析: 1.解法一:最直观的做法是将数组从大到小排序,然后选出其中最大的K个数,但是这样的解 ...
- 算法12--topK求一个数组中第k大的数
求一个数组中第k大的值 解法一: 建立一个k个元素的最大堆,首先将数组中前k个元素放入堆中,此时堆顶元素为第k大的元素,后面继续遍历数组,比较堆顶元素与数组中元素值,当数组中元素小于堆顶元素时,将堆顶 ...
- 算法 求一个数组的最长递减子序列 C
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! //** ...
- 《团队开发一(求一个数组的连续的子数组之和的最大值)》
<团队开发一(求一个数组的连续的子数组之和的最大值)> (1)设计思想:一般的,求一个数组的最大子数组之和即是按数组顺序依次让前几个数的和与下一个数进行比较,设一变量来装每次比较后的较大的 ...
- 算法 - 求一个数组的最长递减子序列(C++)
分享一个大牛的人工智能教程.零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net /** 求一个数组的最长递减子序列 - C++ - ...
- 求一个数组的非空子集
//求一个数组的子集 #include <vector> #include<iostream> using namespace std; vector<vector< ...
- 13.在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和。求一个数组的小和。(左神算法基础班源码)
package basic_class_01; /*** *小和问题在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和.求一个数组的小和.例子:[1,3,4,2,5]1左边比1小的数 ...
- python求数组平均值_用python求一个数组的和与平均值的实现方法
用python求一个数组的和与平均值的实现方法 如下所示: # coding = GBK a =[1,2,3,4,5] sum=0 b = len(a) print("这个数组的长度为:&q ...
最新文章
- sails框架发送邮件
- C# Excel 导入
- 【Win32汇编】数组累加
- 如何把关联性的告警智能添加到 Nagios 上?(2)
- Linux上搭建伪集群 Hadoop3.1
- 使用 docker 命令不用加 sudo
- 编写GO的WEB开发框架 (十三): 配置文件读取
- Dubbo源码分析(一)Dubbo与Spring集成实例
- LinkedHashMap 底层分析
- 顺序存储循环队列的基本操作
- dnf服务器不维修,dnf无法修理装备
- 医药行业的销售数据如何分析?
- 计算机重启打印机无法使用,为什么打印机在电脑重启后就不能用了并且也无法添加?-win7添加打印机...
- 服务器远程连接端口号修改
- 0013-图像的阈值化-OTSU、固定阈值法、基于局部的阈值化
- python Crypto.Cipher
- 微信小程序电子优惠券领取,淘宝客,微信小程序商城
- Kong API Gateway 管理API详解
- 想说说关于在刷题网站(牛客 、C语言网、力扣)上测试样例过了但是OJ判错这档子事
- Clusterrolebindings 创建错误