给定一个没有重复数字的序列,返回其所有可能的全排列。

示例:

输入: [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实现)的更多相关文章

  1. n阶行列式的全排列求解(Java)

    上一个随笔,我介绍了全排列的递归求解,其中还有排列的逆序数等代码,这次我来介绍如何使用全排列计算行列式的值. 使用全排列求行列式的值,简单的描述就是: 对这个行列式每一行选取一个数,这些数处于行列式的 ...

  2. 全排列(java版)

    适用于不同数字的全排列,其实也适用于有重复数字的全排列,只不过的出来的结果有重复,需手动删减掉重复的组合. package testFullPermutation; import java.util. ...

  3. 两种常用的全排列算法(java)

    问题:给出一个字符串,输出所有可能的排列. 全排列有多种算法,此处仅介绍常用的两种:字典序法和递归法. 1.字典序法: 如何计算字符串的下一个排列了?来考虑"926520"这个字符 ...

  4. 字典序全排列(java实现)

    import java.util.Arrays; /** *字典序全排列 *字符串的全排列 *比如单词"too" 它的全排列是"oot","oto&q ...

  5. 历届试题 带分数 全排列模板 JAVA

    标题:带分数 100 可以表示为带分数的形式:100 = 3 + 69258 / 714 还可以表示为:100 = 82 + 3546 / 197 注意特征:带分数中,数字1~9分别出现且只出现一次( ...

  6. 算法笔记_025:字符串的全排列(Java)

    目录 1 问题描述 2 解决方案 2.1 递归实现 2.2 字典序排列实现   1 问题描述 输入一个字符串,打印出该字符串的所有排列.例如,输入字符串”abc”,则输出有字符’a’,’b’,’c’所 ...

  7. hdu 1130,hdu 1131(卡特兰数,大数)

    How Many Trees? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  8. 算法学习之剑指offer(五)

    题目1 题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. public class Solution ...

  9. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  10. java实现全排列

    前天上午的面试遇到了一个用java实现一串数字的全排列的题,想来想去用递归最方便,可是没有在规定的时间内完成555,今天上午有空便继续写,以下是完成后的代码: import java.util.Arr ...

随机推荐

  1. 在虚拟机上安装gho、esd(wim)系统镜像文件

    gho.esd(wim)等文件不能被虚拟机识别,但如果把它们打包成iso就可以了. 另外,还需用到能在虚拟机上运行的WinPE的iso文件,本文用的是微PE. 注意:安装虚拟机提示operating ...

  2. 单元测试Mock框架Powermockito 【mockito1.X】

    <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> &l ...

  3. fjwc2019

    机房搬迁.......再加上文化课.......咕了十几天才有空补上....... day0听一个教授讲理论......在学长的带领下咕掉了..... D1 T1:#178. 「2019冬令营提高组」 ...

  4. tcpdump 抓包工具使用

    1. 常用命令 监听p4p1网卡上来自 192.168.162.14 的包 tcpdump -i p4p1 src host 192.168.162.14 tcpdump -i p4p1 dst po ...

  5. python 爬取历史天气

    python 爬取历史天气 官网:http://lishi.tianqi.com/luozhuangqu/201802.html # encoding:utf-8 import requests fr ...

  6. Android之socket客户端

    接收数据不要用readline(),用read() Socket mSocket = new Socket("192.168.1.100", 8888); DataInputStr ...

  7. 问题:oracle 12c rac数据库服务器的home目录丢失问题解决2018-06-25 18:30

    问题原因:是由于运维粗心,在缩容/home(此目录下挂载了逻辑卷lv_home)时没有先缩小文件系统(resize2fs)也没有备份,导致home数据损坏,重启时系统无法正常启动 解决方案:跳过此ho ...

  8. 网络 --- 3 socket模块 粘包

    一 .socket 模块参数及方法 二.缓冲区 三.粘包 1.两种粘包现象 ①连续的小包可能会被优化算法给组合到一起进行发送 ②第一次如果发送的数据大小2000B接收端一次性接受大小为1024, 这就 ...

  9. 从Git上导入Maven 项目到Eclipse

    Note: 经验之谈,操作过程中有不懂的地方可以留言问. Step: Open the Eclipse: --1.File>>Import>>Git:Project from ...

  10. 0基础学安卓--初识安卓Activity

    知识储备:windows+ Android Studio 等环境安装. 安卓中Activity代表页的意思,也就是☞我们手机上当前的整个界面显示,点击按钮等操作可以跳转到另外一个Activity中. ...