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

示例:

输入: [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. 八数码问题 Eight Digital Problem

    八数码问题 利用启发式搜索,找出以下问题的最优解. #include <iostream> #include <vector> #include <algorithm&g ...

  2. Exp2_固件程序设计 20165226_20165310_20165315

    Exp2_固件程序设计 20165226_20165310_20165315 Exp2_1 MDK 实验内容 注意不经老师允许不准烧写自己修改的代码 两人(个别三人)一组 参考云班课资源中" ...

  3. bzoj 2091 The Minima Game - 动态规划 - 博弈论

    题目传送门 需要验证权限的传送门 题目大意 Alice和Bob轮流取$n$个正整数,Alice先进行操作.每次每人可以取任意多的数,得分是这一次取的所有数中的最小值.Alice和Bob都足够聪明,他们 ...

  4. bash 变量

    本地变量: 变量赋值:name=value 变量引用:${name}  , $name "":变量名会替换为其值 '':变量名不会替换为其值 查看变量: set 撤销变量:unse ...

  5. Django项目的创建与介绍.应用的创建与介绍.启动项目.pycharm创建启动项目.生命周期.三件套.静态文件.请求及数据.配置Mysql完成数据迁移.单表ORM记录的增删改查

    一.Django项目的创建与介绍 ''' 安装Django #在cmd中输入pip3 #出现这个错误Fatal error in launcher: Unable to create process ...

  6. 排它平方数|2013年蓝桥杯A组题解析第二题-fishers

    排它平方数 小明正看着 203879 这个数字发呆. 原来,203879 * 203879 = 41566646641 这有什么神奇呢?仔细观察,203879 是个6位数,并且它的每个数位上的数字都是 ...

  7. c 语言中宏定义和定义全局变量的区别

    宏定义和定义全局变量的区别: 1 作用时间不同. 宏定义在编译期间即会使用并替换,而全局变量要到运行时才可以. 2 本质类型不同. 宏定义的只是一段字符,在编译的时候被替换到引用的位置.在运行中是没有 ...

  8. Linux配置ssh服务和XShell连接Linux

    SSH服务查看和安装,配置: https://www.cnblogs.com/qiuqiuqiu/p/6445426.html https://www.cnblogs.com/yunweis/p/77 ...

  9. RHEL7防火墙策略设置

    注意查看firewall防火墙状态,并设置. 打开防火墙且没有放行端口的情况下rhel7这台机器是ping不通的. 放行端口需要永久放行,加--permernant,否则重启后失效,仍然无法访问该端口 ...

  10. Python实现机器学习算法:逻辑回归

    import numpy as np import matplotlib.pyplot as plt from sklearn.datasets.samples_generator import ma ...