全排列问题Ⅰ(Java实现)
给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
看到这个题目,我们应该有这样的思路:
比如就如题【1,2,3】,我们来分析:
1.定1,来求2,3的全排列
1.1.定2,来求3的全排列
1.1.1.只有3了。所以得到的答案为【1,2,3】
1.2回到刚刚的2,3全排列,因为3排了,2没有变,所以此时2不得不变,得到的答案是【1,3,2】
2.定1已经完了,这时候1不得不变了,所以定2,求1,3的全排列
2.1.定1,来求3的全排列
2.1.1.只有3了。所以得到的答案为【2,1,3】
2.2回到刚刚的1,3全排列,因为3排了,1没有变,所以此时1不得不变,得到的答案是【2,3,1】
2.定1,2已经完了,这时候1,2不得不变了,所以定3,求1,2的全排列
2.1.定1,来求2的全排列
2.1.1.只有2了。所以得到的答案为【3,1,2】
2.2回到刚刚的1,2全排列,因为2排了,1没有变,所以此时1不得不变,得到的答案是【3,1,2】
因此最后的答案是【1,2,3】 【1,3,2】 【2,1,3】 【2,3,1】 【3,1,2】 【3,1,2】
我们可以再来一个复杂的例子:
比如:[1,2,4,5]我们要求它的全排列,分析如下:
1.定1,来求2,4,5的全排列
1.1.定2,来求4,5的全排列
1.1.1.定4,求5的全排列,
1.1.1.1只有5了。所以得出【1,2,4,5】
1.1.2回到刚才的保持2不变,求4,5的排列。因为4不变过,所以4不能打头了。故结果为【1,2,5,4】
1.2.等到2以后的都排列完了后,2不得不变,所以定4,求2,5的全排列
1.2.1.保持2不变,求5的全排列
1.2.1.1.只有4了。所以得出【1,4,2,5】
1.2.2回到刚才的保持4不变,求2,5的排列。因为2不变过,所以2不能打头了。故结果为【1,4,5,2】
1.3.等到2.4都定完了后,2,4不得不变,所以定5,求2,4的全排列
1.2.1.保持2不变,求4的全排列
1.2.1.1.只有4了。所以得出【1,5,2,4】
1.2.2回到刚才的保持5不变,求2,4的排列。因为4不变过,所以4不能打了。故结果为【1,5,4,2】
..............
所以以第一个打头的有 【1,2,4,5】 【1,2,5,4】 【1,4,2,5】 【1,4,5,2】 【1,5,2,4】 【1,5,4,2】
这只是定第一个数字的情况,其他的和这个类似,就不多写重复的思路了。 ...........
具体的实现代码如下:
package edu.ymm.about_permutation; import java.util.ArrayList;
import java.util.List; public class Permutation {
static List<List<Integer>> lists=new ArrayList<>();
public static List<List<Integer>> permute(int[] nums) { List<Integer> list=new ArrayList<>();
if(nums.length==0||nums==null){
return lists;
}
permute(nums,list,0);
return lists;
} private static void permute(int[] nums, List<Integer> list, int index) {
//边界值判断
if(index==nums.length){
lists.add(new ArrayList<>(list));
return;
}
//i是从开始 i=index ;swap(,i)index相当于固定当前位置,在进行下一位的排列。
for(int i=index;i<nums.length;i++){
swap(nums,index,i); //第一次交换定点之后的
list.add(nums[index]); //把找到的加进去
permute(nums,list,index+1); //进行递归
list.remove(list.size()-1); //其中定位定完的需要定后面的数据
swap(nums,index,i); //这是交换定点的,也就是重新返回上一级进行交换 } } private static void swap(int[] nums, int index, int i) {
int t =nums[index];
nums[index] = nums[i];
nums[i] = t;
} public static void main(String[] args){
int[] nums=new int[]{1,2,3};
List<List<Integer>> lists=new ArrayList<>();
lists=permute(nums);
for(List<Integer> list:lists){
for(int i:list){
System.out.print(i+" ");
}
System.out.println();
}
}
}
执行结果为:

全排列问题Ⅰ(Java实现)的更多相关文章
- n阶行列式的全排列求解(Java)
上一个随笔,我介绍了全排列的递归求解,其中还有排列的逆序数等代码,这次我来介绍如何使用全排列计算行列式的值. 使用全排列求行列式的值,简单的描述就是: 对这个行列式每一行选取一个数,这些数处于行列式的 ...
- 全排列(java版)
适用于不同数字的全排列,其实也适用于有重复数字的全排列,只不过的出来的结果有重复,需手动删减掉重复的组合. package testFullPermutation; import java.util. ...
- 两种常用的全排列算法(java)
问题:给出一个字符串,输出所有可能的排列. 全排列有多种算法,此处仅介绍常用的两种:字典序法和递归法. 1.字典序法: 如何计算字符串的下一个排列了?来考虑"926520"这个字符 ...
- 字典序全排列(java实现)
import java.util.Arrays; /** *字典序全排列 *字符串的全排列 *比如单词"too" 它的全排列是"oot","oto&q ...
- 历届试题 带分数 全排列模板 JAVA
标题:带分数 100 可以表示为带分数的形式:100 = 3 + 69258 / 714 还可以表示为:100 = 82 + 3546 / 197 注意特征:带分数中,数字1~9分别出现且只出现一次( ...
- 算法笔记_025:字符串的全排列(Java)
目录 1 问题描述 2 解决方案 2.1 递归实现 2.2 字典序排列实现 1 问题描述 输入一个字符串,打印出该字符串的所有排列.例如,输入字符串”abc”,则输出有字符’a’,’b’,’c’所 ...
- hdu 1130,hdu 1131(卡特兰数,大数)
How Many Trees? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- 算法学习之剑指offer(五)
题目1 题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. public class Solution ...
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- java实现全排列
前天上午的面试遇到了一个用java实现一串数字的全排列的题,想来想去用递归最方便,可是没有在规定的时间内完成555,今天上午有空便继续写,以下是完成后的代码: import java.util.Arr ...
随机推荐
- bzoj4698 / P2463 [SDOI2008]Sandy的卡片
P2463 [SDOI2008]Sandy的卡片 直接二分长度暴力匹配....... 跑的还挺快 (正解是后缀数组的样子) #include<iostream> #include<c ...
- rabbitmq heartbeat missing with heartbeat = N seconds原因总结
一直以来,在我们大规模使用rabbitmq的服务端应用中,都没有出现rabbitmq心跳超时而造成的的影响,反倒是在rabbitmq-cpp客户端出现过很多次该问题,一直以为客户端lib实现的问题(不 ...
- spring boot 结合Redis 实现工具类
自己整理了 spring boot 结合 Redis 的工具类引入依赖 <dependency> <groupId>org.springframework.boot</g ...
- 【python041--构造方法:构造和析造】
一.魔法方法 1.魔法方法总是被双下划线包围,例如:__init__ 2.为什么在类实例化的时候,有时候需要构造__init__,有时候不需要呢 举例说明: #定义一个矩形的类,需要长和宽两个参数,计 ...
- Bootstrap3基础 btn-primary/warning... 三类按钮的六种样式
内容 参数 OS Windows 10 x64 browser Firefox 65.0.2 framework Bootstrap 3.3.7 editor ...
- Python3 tkinter基础 Canvas create_text 在画布上添加文字
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- Git学习笔记---协作的一般流程
一般的操作流程 1.pull 王小坤与另一个同事张大炮一起开发一个项目,张大炮昨天修改了数据库读写的api,优化了执行速度,并把read()函数改名成了Read(),下午下班之前把这些代码push到服 ...
- vba编程基础1
在主要的编程语言中, 结构体是用大括号来表示 代码段的 范围 界定的. 但是在一些比较"老的"语言中,由于历史原因, 还是使用的 是: 关键字来进行界定代码 的 结构段, 如vba ...
- hihoCoder week20 线段树的区间修改
区间修改 区间查询 最后一场比赛前的无可救药的热身 #include <bits/stdc++.h> using namespace std; #define mid ((l+r)/2) ...
- 配置和运行 MatchNet CVPR 2015 MatchNet: Unifying Feature and Metric Learning for Patch-Based Matching
配置和运行 MatchNet CVPR 2015 GitHub: https://github.com/hanxf/matchnet 最近一个同学在配置,测试这个网络,但是总是遇到各种问题. 我也尝试 ...