全排列问题Ⅰ(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 ...
随机推荐
- Golang获取int数组里的最大值和下标
package main import ( "fmt" ) func main() { //获取一个数组里最大值,并且拿到下标 //声明一个数组5个元素 ], , , ,} //假 ...
- Strom学习笔记2:Storm Maven Project-StromStack工程
1:IntelliJ新建Maven工程
- P1290 欧几里德的游戏
P1290 欧几里德的游戏 原本不想写的,但细节有些多qwq,还是放上吧. 假设a严格大于b 当a<b*2时,只有一种方法往下走:否则就可以有多种方法,并且一定至少有一种可以使自己必胜,因为可以 ...
- paymob浙江正和
#region 上海 ZH //else if (order.SP.Contains("上海") && order.Area.Contains("移动&q ...
- Elasticsearch.Net使用(一)【入门篇】
http://blog.csdn.net/wulex/article/details/52138564 加数据 //在调用下面的index方法的时候,如果没有指定使用哪个index,ElasticSe ...
- How To Answer The Question "tell me about yourself" In An Interview
Two or three minutes. ponit list: education experience highlight accomplishments show passion/ drive ...
- Codeforces 15E Triangles - 组合数学
Last summer Peter was at his granny's in the country, when a wolf attacked sheep in the nearby fores ...
- topcoder srm 525 div1
problem1 link 最后剩下的是中间的一个矩形.所以可以直接枚举这个矩形,如果它含有的硬币个数等于$K$,则再计算移动的最少次数,更新答案. problem2 link 首先,每个节点发送每种 ...
- Python3 tkinter基础 LabelFrame StringVar 单击按钮,Label中显示的文字更换
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- Docker 入门指南——资源工具篇
好工具 dive wagoodman/dive A tool for exploring each layer in a docker image 参考 用 Dive 看 Docker Image 裡 ...