java与算法之-数字全排列(代码片段)

xiaoshen666 xiaoshen666     2022-12-21     388

关键词:

全排列是指n个数(或其他字符)所有可能的排列顺序,例如1 2 3三个数字的全排列是

1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

那么问题来了,任意输入一个大于1的数字n,列出1-n这n个数字的全排列。

如果尝试手动列举一下1 2 3的全排列,会发现通常我们会在头脑中制定好规则,并按照既定规则进行枚举,从而得到所有排列。

在这里我们制定的规则是:

(想象我们手里拿了3个数字,地上有A、B、C三个空位)

1)在每一个空位前,都按照1->2->3的顺序尝试放下一个数字,如果该数字已经放下则尝试下一个

2)每放下一个数字后向后移动一格,然后重复1->2->3的尝试

3)如果当前位置没有新的可能性,取回当前位置的数字并左移一格从新尝试

按上面规则很容易推算出第一种排列是1 2 3

取回3,返回B位置,取回2,然后按1->2->3尝试,发现可以放下3,右移到C,尝试后放下2,得到1 3 2

接下来必须返回到A的位置才有新的可能性,此时已经取回所有数字,按规则放下2,移到B,放下1,移到C,放下3,得到2 1 3

。。。

下面来看实现的代码:

    public class Permutation 
     
        private int max;
        private int[] array;
        private int[] hold;
        
        public Permutation(int max) 
            this.max = max;
            array = new int[max + 1];
            hold = new int[max + 1];
        
        
        public void permute(int step) 
            if(step == max + 1) 
                for(int i = 1; i <= max; i++) 
                    System.out.print(array[i] + " ");
                
                System.out.println();
                return;  //返回上一步, 即最近一次调用permute方法的后一行
            
            //按照1->2->3->...->n的顺序尝试
            for(int num = 1; num <= max; num++) 
                //判断是否还持有该数字
                if(hold[num] == 0) 
                    array[step] = num;
                    hold[num] = 1;
                    //递归: 右移一格重复遍历数字的尝试
                    permute(step + 1);
                    //回到当前位置时取回当前位置数字
                    hold[num] = 0;
                
            
        
        
        public static void main(String[] args) 
            Permutation fa = new Permutation(3);
            fa.permute(1);
        
    


运行输出

    1 2 3
    1 3 2
    2 1 3
    2 3 1
    3 1 2
    3 2 1
我们用一个伪时序图来帮助理解递归调用的执行过程

技术图片

 

顺便说一句,全排列问题还有多种算法,本文中使用的是深度优先算法的模型。
---------------------
原文:https://blog.csdn.net/autfish/article/details/52385253

java数据结构与算法之全排列问题(代码片段)

...【剪枝】操作来保证结果集里不会有重复字符串对于递归算法主要是【分析子问题】、【找到递归点】、【确定递归参数(需要几个参数、哪些是变参,哪些是不变参)】、【确定递归退出条件】,算法也比较简... 查看详情

全排列(代码片段)

全排列回溯算法之排列树一问题描述给出一串字符的全排列二问题分析采用回溯算法之排列树三代码实现packagebacktracking_perm;importjava.io.BufferedWriter;importjava.io.FileWriter;importjava.io.IOException;importjava.util.Arrays;importjava.util.LinkedList 查看详情

leetcode下一个排列与全排列问题(代码片段)

...31.下一个排列题目描述:??实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。??如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。??必须原地修改,只允... 查看详情

一文通数据结构与算法之——回溯算法+常见题型与解题策略+leetcode经典题(代码片段)

文章目录回溯算法1基本内容1.1回溯算法的框架1.2回溯核心思想1.3回溯法解决的问题1.4题目列表1.4常见问题分析2经典力扣题2.1全排列问题2.1.1没有重复元素的全排列2.1.2含重复元素的递归全排列2.2子集问题2.2.1不含重复元素的子集2... 查看详情

java数据结构与算法之全排列问题

①、问题描述给你一个字符串str,返回这个字符串的全部排列,比如:str=“abc”返回,[abc,acb,bac,bca,cab,cba]注意:如果字符串str里有重复字符呢?要求返回的全排列集合里不能存在重复字符串,比如&... 查看详情

算法设计:全排列算法代码实现(代码片段)

在上星期的算法设计课程的学习中,我们学习了两种全排列算法,该算法用于求出数组1,2,3,...,n的所有可能的排列,今天我们就来看看这个算法的具体代码实现。 1. 第一种算法第一种算法和我们现实生活中习惯的方法较... 查看详情

c++数学与算法系列之排列和组合(代码片段)

1.前言本文将聊聊排列和组合,排列组合是组合学最基本的概念,在程序运用中也至关重要。排列问题:指从给定个数的元素中取出指定个数的元素进行排序。组合问题:指从给定个数的元素中仅仅取出指定个数的元素,不排序... 查看详情

字符串算法之应用递归进行全排列(代码片段)

#include<iostream>usingnamespacestd;charstr[]="1234";intsize=sizeof(str)/sizeof(char);//size的实际长度比str的长度多一位voidfact(intfrom,intto)//from为起点,to为终点if(from==to)for(inti=0;i<=to;i++)cout<&l 查看详情

洛谷p1706全排列问题(java版)(代码片段)

...不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字。输入格式一个整数n。输出格式由1∼n组成的所有不重复的数字序列,每行一个序列。每个数字保留5个场宽。输入3输出123132213231312321... 查看详情

算法问题寻找全排列的下一个数(代码片段)

寻找全排列的下一个数摘自漫画算法:题目:给出一个正整数,找出这个正整数所有数字全排列的下一个树。说的通俗点就是在一个整数所包含数字的全部组合中,找到一个大于且仅大于原数的新整数。例子:如果输入12345,则... 查看详情

算法问题寻找全排列的下一个数(代码片段)

寻找全排列的下一个数摘自漫画算法:题目:给出一个正整数,找出这个正整数所有数字全排列的下一个树。说的通俗点就是在一个整数所包含数字的全部组合中,找到一个大于且仅大于原数的新整数。例子:如果输入12345,则... 查看详情

算法设计与分析5.3数字排列(代码片段)

★题目描述给两个正整数A和B,请问通过重新排列A获得小于或等于B的最大数字是多少(不含前导0)?★输入格式输入的第一行两个数字A和B,保证这两个数字在int范围内。★输出格式输出A重新排列后小于或等于B的最大整数(不含前... 查看详情

暴力之全排列(代码片段)

...和减法来表示一个数,他给大家9张卡片,然后报出一个数字,要求大家用表达式的形式来表示出这个数100可以表示为这样的形式:100=129*67-8543,还可以表示为:100=13*489-6257注意特征:表达式中,数字1~9分别出现且只出现一次(... 查看详情

四种语言刷算法之47.全排列ii(代码片段)

47. 全排列II1、C/***Returnanarrayofarraysofsize*returnSize.*Thesizesofthearraysarereturnedas*returnColumnSizesarray.*Note:Bothreturnedarrayand*columnSizesarraymustbemalloced,assumecallercallsfree().*/voidback(int*nums,intnumsSize,int*returnSize,int**returnColumnSizes,int*path,int*pathSize,i... 查看详情

next_permutation与prev_permutation(全排列算法)(代码片段)

stl提供了权排列算法,以后暴力举例就方便多啦文末有手动求,按字典序排序的全排列的第n个排列,的求法 next_permutation(a,a+4); 检测数组的a[0]到a[3],如果不是“完全倒序”(如:4,3,2,1),就继续执行全排列prev_permul... 查看详情

《leetcode之每日一题》:191.全排列(代码片段)

...目题解题目链接:全排列有关题目给定一个不含重复数字的数组nums,返回其所有可能的全排列。你可以按任意顺序返回答案。示例1:输入:nums=[1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例2:... 查看详情

数据结构与算法之深入解析“优美的排列”的求解思路与算法示例(代码片段)

一、题目要求假设有从1到n的n个整数,用这些整数构造一个数组perm(下标从1开始),只要满足下述条件之一,该数组就是一个优美的排列:perm[i]能够被i整除;i能够被perm[i]整除;给你一个整数n,返回可以构造的优美排列的数... 查看详情

从零开始学算法——回溯(代码片段)

首先介绍“回溯”算法的应用。“回溯”算法主要用于搜索,有时“回溯算法”也叫“回溯搜索”。这里“搜索”的意思是“查找所需要的解”。我们每天使用的“搜索引擎”就是帮助... 查看详情