全排列的打印 绝地灬酷狼 2022-03-22 04:29 155阅读 0赞 ## 题目:给定几个不重复数字,请输出全排列 ## 示例:1,2,3 输出:1,2,3 1,3,2 2,1,3 2,3,1 3,2,1 3,1,2 思考:给定的字符是1,2,3,…n 全排列会允许任一字符能到达任一位置 比如:1,2,3 如果固定 1为第一个字符,则需要对 2,3 进行全排列 如果固定 2为第一个字符,则需要对 1,3 进行全排列(为什么不是3,1被?这里是将1与2位置交换,方便思考,以免混乱) 如果固定 3位第一个字符,则需要对 2,1 进行全排列 也就是说: 给定k=0,k及其之后任意元素交换到位置k,此时输出都是一个全排列 k不断增加,直到k=数组长度,则表示已经尝试了所有的全排列 似乎就可以使用递归了,固定某一段位置,对剩下部分求全排列 /** * @author wangwei * @date 2019/1/25 20:43 * @classDescription 打印n个数的全排列:每个元素都可以放到位置k, k 初始化为0,k之后的元素都可以交换到位置k, * 每个元素都可以放到k+1, * 知道k位于最后一个位置,表示已经处理完,可以输出 * 比如输入 3 * 输出:1,2,3 * 1,3,2 * 2,1,3 * 2,3,1 * 3,2,1 * 3,1,2 */ public class FullPermutation { public static void print(int array[],int k){ if(k==array.length-1){ for(int i=0;i<array.length;i++){ System.out.print(array[i]+" "); } System.out.println(); return; } for(int i=k;i<array.length;i++){ ArrayUtil.swap(array,k,i); print(array,k+1); ArrayUtil.swap(array,k,i); } } public static void main(String[] args) { int [] array=new int[]{ 1,2,3}; print(array,0); } /** * 思考:如果有重复元素,那么怎么输出所有的全排列呢? * 需要记录与当前k交换的元素值,如果同一种元素交换到k位置过,那么就不再交换 */ } 测试效果:输入 1,2,3 输出: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM2OTIyOTI3_size_16_color_FFFFFF_t_70] ## 变式:给定几个数字(可能重复),请输出全排列 ## 示例:1,2^,2 输出:1,2^,2 (姑且认为2是不一样的) 这里是1与1交换 1,2,2^ (重复) ----- 2^与2交换 2,2^,1 - ---- 1与2交换 2,1,2^ ----- 2^与1交换 2^,1,2(重复) ----- 1与2^ 交换 2^,2,1(重复) ------ 1与2交换 **重复元素怎么处理呢??** 标记已经交换过的元素,如果交换过,则不再交换 public static void print(int array[],int k){ if(k==array.length-1){ for(int i=0;i<array.length;i++){ System.out.print(array[i]+" "); } System.out.println(); return; } // boolean[] record=new boolean[1024];//记录交换的数据 for(int i=k;i<array.length;i++){ if(record[array[i]]){ continue;//有交换记录,跳过此次交换 } ArrayUtil.swap(array,k,i); print(array,k+1); ArrayUtil.swap(array,k,i); record[array[i]]=true; } } 测试效果: 1,2,2 输出: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM2OTIyOTI3_size_16_color_FFFFFF_t_70 1] [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM2OTIyOTI3_size_16_color_FFFFFF_t_70]: /images/20220322/2f5f7fd5b12f4755ba6a294f0171662f.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM2OTIyOTI3_size_16_color_FFFFFF_t_70 1]: /images/20220322/72ef09a24ceb4cabbf13a0396601e88f.png
相关 打印全排列(DFS) > 前言:OJ上一道简单算法题,打印全排列。用深度优先搜索(DFS)来实现,顺便记录一下基础DFS模板。 题目描述 给定一个正整数n,取出前n小的正整数,即 1~n 这 超、凢脫俗/ 2023年03月01日 08:38/ 0 赞/ 33 阅读
相关 python打印字符串全排列_Python字符串的全排列算法实例详解 本文实例讲述了Python字符串的全排列算法。分享给大家供大家参考,具体如下: 题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打 迈不过友情╰/ 2022年10月31日 15:59/ 0 赞/ 283 阅读
相关 全排列 问题描述:设有\{r1,r2,...,rn\}共n个元素,这n个元素中可能存在重复元素,试设计一个算法,列出这n个元素的不同排列。 参考代码: inclu 电玩女神/ 2022年08月05日 02:54/ 0 赞/ 190 阅读
相关 全排列 题目描述 给定一个没有重复数字的序列,返回其所有可能的全排列。 示例: 输入: [1,2,3] 输出: [ [1,2,3], 以你之姓@/ 2022年04月25日 06:54/ 0 赞/ 197 阅读
相关 全排列的打印 题目:给定几个不重复数字,请输出全排列 示例:1,2,3 输出:1,2,3 1,3,2 2,1,3 2,3,1 3,2,1 3,1,2 思考: 绝地灬酷狼/ 2022年03月22日 04:29/ 0 赞/ 156 阅读
相关 全排列 全排列是将一组数按一定顺序进行排列,如果这组数有n个,那么全排列数为n!个。现以\{1, 2, 3, 4, 5\}为 例说明如何编写全排列的递归算法。 1、首先看 男娘i/ 2022年03月19日 01:50/ 0 赞/ 241 阅读
相关 全排列 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 示例: 输入:"23" 输 约定不等于承诺〃/ 2022年02月15日 00:47/ 0 赞/ 268 阅读
相关 全排列 talk is cheap, show me the code. public static void permutation(char[]ss,int i){ 蔚落/ 2022年01月29日 04:55/ 0 赞/ 285 阅读
相关 全排列 全排列:【1,2,3】 输出: 1,2,3 1,3,2 2,1,3 2,3,1 3,1,2 3,2,1 实现思路: 利用递归回溯法,为每个数 冷不防/ 2021年09月26日 15:14/ 0 赞/ 368 阅读
还没有评论,来说两句吧...