经典算法之全排列(详集)

经典算法之——解决全排列问题以及详解 回溯”指的是“状态重置”,可以理解为“恢复现场”,是在编码的过程中,是为了节约空间而使用的,而在递归或者深度优先中根据需要的场合来配合回溯法可以进一步对自己的代码进行优化。, n-1, n},方向都为向左。邻位对换法是全排列生成算法中的其中一种,它的换位是双向的,通过保存数字的“方向性”来快速得到下一个排列。最后以 3 开头的全排列为[3, 1, 2], [3, 2, 1];以 1 开头的全排列为[1, 2, 3], [1, 3, 2];以 2 开头的全排列为[2, 1, 3], [2, 3, 1]; 阅读详情

我总结了全排列的各种题解,若有不全之处还请各位大大们慷慨指出.


1. 全排列之取球游戏

问题描述:

  m球中取n个球,共有多少种取法


解题思路:

  用递归思想解题.乍眼一看貌似递归无下手之处,其实每一个球只有两种情况:要么取, 要么不取. 若用m表示球的个数,n表示需要取的球的总数,那么当前球取则return fun(m - 1, n - 1) ; 不取则 return fun(m - 1, n);


代码实现:

github上相关代码:https://github.com/striner/javaCode/blob/master/Take%20the%20ball

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

//全排列练习

//1.取球游戏 m球中取n个球,共有多少种取法
public class Main {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		int m = input.nextInt();    //共有m个球
		int n = input.nextInt();    //取n个球
		int num = fun(m, n);        //共有num种取法
		System.out.println(num);
		input.close();
	}

	public static int fun(int m, int n) {

		if (n == 0) return 1;   //m个球中取0个球,只有一种取法
		if (m == n) return 1;   //m个球中取m个球,只有一种取法
		
		//假设有一个球做了标记,那么它就有两种取法: 取 或 不取
		return fun(m - 1, n - 1) + fun(m - 1, n);
	}
}


运行结果:



2. 全排列之字符串数组组合计数问题

问题描述:

  求出输入字符串数组的全排列结果


解题思路:

  用ArrayList<>集合存放每一种可能的排列.用fun(str.substring(0, i) + str.substring(i + 1))递归,将每一次的str.charAt(i)提取出来并拼到下一次递归的排列结果之前.


代码实现:

github上相关代码:https://github.com/striner/javaCode/blob/master/An%20array%20of%20strings%20of%20Full%20Permutation

//2. 字符串数组全排列  组合计数问题
//求出输入字符串数组的全排列结果
class Main1 {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		String str = input.nextLine();
		List<String> list = fun(str);

		for (int i = 0; i < list.size(); i++) {
			System.out.println(list.get(i));
		}
		
		input.close();
	}

	public static List<String> fun(String str) {

		List<String> list = new ArrayList<>();
		if (str.length() == 1) {
			list.add(str);
			return list;
		}
		for (int i = 0; i < str.length(); i++) {
			char c = str.charAt(i);
			List<String> t = fun(str.substring(0, i) + str.substring(i + 1));
			for (int j = 0; j < t.size(); j++) {
				list.add("" + c + t.get(j));
			}
		}
		return list;
	}
}


运行结果:




3.全排列之字符串数组组合计数问题(数组实现)

问题描述:

  求出输入字符串数组的全排列结果


解题思路:

  通过数组中每一个元素与其后面元素一一交换实现


代码实现:

github上相关代码:https://github.com/striner/javaCode/blob/master/An%20array%20of%20strings%20of%20Full%20Permutation%20By%20Arrays

//3. 用数组实现字符串数组的全排列
//通过数组中每一个元素与其后面元素一一交换实现
class Main2 {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		String str = input.nextLine();
		char[] arr = str.toCharArray();
		fun(arr, 0);
		
		input.close();
	}

	public static void fun(char[] arr, int index) {   //arr:待排数据   index: 考虑的当前位置(数组下标)

		if (index == arr.length - 1) {
			System.out.println(String.valueOf(arr));
			return;
		}
		
		for (int i = index; i < arr.length; i++) {
			char ch = arr[i]; arr[i] = arr[index]; arr[index] = ch;     //试探
			fun(arr, index + 1);
			ch = arr[i]; arr[i] = arr[index]; arr[index] = ch;      //回溯
		}
	}
}


运行结果:



4. 全排列之固定数目的组合问题

问题描述:

   输入一串字符串数组,并中取3个数输出所有的可能结果


解题思路:

  由于所需取出的球数仅为3种,可以直接暴力破解. 后文会介绍取出不定球数或球数很多时的解法.


代码实现:

github上相关代码:https://github.com/striner/javaCode/blob/master/The%20combinatorial%20problem%20of%20fixed%20number

//4. 固定数目的组合问题  组合枚举循环暴力法
//输入一串字符串数组,并中取3个数输出所有的可能结果
class Main3 {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		String string = input.nextLine();
		char[] ch = string.toCharArray();
		fun(ch);
		
		input.close();
	}

	public static void fun(char[] ch) {

		for (int i = 0; i < ch.length; i++) {
			for (int j = i + 1; j < ch.length; j++) {
				for (int k = j + 1; k < ch.length; k++) {
					System.out.println("" + ch[i] + ch[j] + ch[k]);
				}
			}
		}
	}
}


运行结果:




5. 全排列之不定数目的组合问题

问题描述:

  从输入的字符数组中取n个字母,都有哪些取法


解题思路:

  采用组合枚举递归法解题,并用ArrayList对每种排列结果进行存储.


代码实现:

github上相关代码:https://github.com/striner/javaCode/blob/master/Variable%20number%20of%20combinatorial%20problems

//5. 不定数目的组合问题 组合枚举递归法
//从输入的字符数组中取n个字母,都有哪些取法
class Main4 {
	public static void main(String[] args) {
		 Scanner input = new Scanner(System.in);
		 String str = input.next();   
		 int n = input.nextInt();    //串str中取n个字母
		 List<String> list = fun(str, n);
		 for (int i = 0; i < list.size(); i++) {
			 System.out.println(list.get(i));
		 }
		 
		 input.close();
	}

	public static List<String> fun(String str, int n) {

		List<String> list = new ArrayList<>();
		if (n == 0) {
			list.add("");
			return list;
		}
		for (int i = 0; i < str.length(); i++) {
			char ch = str.charAt(i);
			List<String> t = fun(str.substring(i + 1), n - 1);
			for (int j = 0; j < t.size(); j++) {
				list.add("" + ch + t.get(j));
			}
		}
		return list;
	}
}


运行结果:




6. 全排列之组合重复问题

问题描述:

"AABBBC" 取3个,都有哪些取法


解题思路:

此题用data[]数组对每个元素的最大个数进行存储,用x[]来表示每个元素所取的个数,采用递归方式求得每一种结果并打印输出.


代码实现:

github上相关代码:https://github.com/striner/javaCode/blob/master/Repeat%20combination

//6. 组合重复
//"AABBBC" 取3个,都有哪些取法
class Main5 {
	public static void main(String[] args) {

		int[] data = {2, 3, 1};     //每个元素的最大个数 限制条件
		int[] x = new int[data.length];     //每个元素取几个
		
		fun(data, x, 0, 3);
	}

	public static void fun(int[] data, int[] x, int k, int goal) {  //k: 当前考虑的数的下标  goal:距离目标的剩余个数

		if (k == x.length) {
			if (goal == 0) 
				work(x);
			return;
		}
		
		for (int i = 0; i <= Math.min(data[k], goal); i++) {
			x[k] = i;
			fun(data, x, k + 1, goal - i);   //试探
		}
		x[k] = 0;   //回溯	
	}

	public static void work(int[] x) {

		for (int i = 0; i < x.length; i++) {
			for (int j = 0; j < x[i]; j++) {  //x[i]表示第i项的数最高出现几次
				System.out.print((char)('A' + i));
			}
		}
		System.out.println();
	}
}


运行结果:







经典算法题2:递归和字典序的全排列算法 1,递归的全排列算法 阅读详情

相关推荐

排列组合源代码程序, 简单易懂

排列组合的源代码, 利用分治法和递归思想, 请大家点评~, Thanks

算法 | 全排列问题(图文详解)

目录 一.全排列的定义 1.什么是全排列 2.例子 二.code 三.分析 一.全排列的定义 1.什么是全排列 从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。 2.例子 假设现在有一个数组ar如下 ar[3]={1,2,3}; 那么这个数组的全排列就是 1,2,3 1,3,...

ThinPikachu的博客 5万+

全排列算法的原理和实现代码

全排列是将一组数按一定顺序进行排列,如果这组数有n个,那么全排列数为n!个。现以{1, 2, 3, 4, 5}为例说明如何编写全排列的递归算法。 1、首先看最后两个数4, 5。 它们的全排列为4 5和5 4, 即以4开头的5的全排列和以5开头的4的全排列。 由于一个数的全排列就是其本身,从而得到以上结果。 2、再看后三个数3, 4, 5。它们的全排列为3 4 5、3 5 4、 4 3 5、 4 5 3、 5 3 4、 5 4 3 六组数。 即以3开头的和4,5的全排列的组合、以4开头的和3,5的全排列的组合和以5开头的和3,4的全排列的组合. 从而可以推断,设一组数p = {r1, r2, r

全排列算法的全面解析

概述 对数组进行全排列是一个比较常见问题,如果是一个比较喜欢考算法的公司(貌似一些大公司都比较喜欢考算法),那么估计就会考察应聘者这个全排列的问题了(就算不让你编写完整代码,也会让你描述大致的思路)。这个问题也难也难,说易也易,下面我就来对这个问题进行一个比较全面的解析吧。如有遗漏,还望指正。 版权说明 著作权归作者所有。 商业转载请联系作者获得授权,非商业转载...

weixin_30510153的博客 2115

阿里云人工智能工程师ACA认证免费课程学习笔记

阿里云人工智能工程师ACA认证免费课程学习笔记

engchina的专栏 2014

完整IC设计流程解析&Makefile学习

本文介绍了decorder38项目的文件结构、自动化综合流程和Makefile使用方法。项目包含RTL到GDSII全流程文件,重点关注syn目录中的综合脚本。通过make dc命令运行综合流程,生成网表、约束和时序文件。关键报告如qor.rpt、area.rpt和min_vio.rpt用于分析综合质量、面积和时序。Makefile部分解释了其基本语法、IC设计中的典型结构,包括目标定义、命令执行和特殊声明,强调了其在自动化构建和依赖管理中的重要性。

m0_63352623的博客 855

【算法】——全排列算法讲解

一篇文章让你彻底掌握全排列算法

m0_56069910的博客 1万+

Zynq裸机调试RTL8211FS网卡踩坑记:从ping不通到完美兼容的完整代码修改

本文详细记录了在Zynq平台上使用Xilinx SDK(XSDK)调试RTL8211FS网卡的完整过程,从最初的ping不通问题到最终实现完美兼容的解决方案。通过分析PHY芯片的寄存器配置差异,提供了关键代码修改和调试技巧,帮助开发者快速解决类似问题。

weixin_42550597的博客 422

全排列算法

全排列的概念 排列 从n个数中选取m(m<=n)个数按照一定的顺序进行排成一个列,叫作从n个元素中取m个元素的一个排列。不同的顺序是一个不同的排列。从n个元素中取m个元素的所有排列的个数,称为排列数(几种排法)。 全排列 从n个元素取出n个元素的一个排列,称为一个全排列。全排列的排列数公式为 n! 时间复杂度 n个数的全排列有n!种,每一个排列都有n个数据,所以输出的时间复杂度为O(n*n!),呈指数级,无法处理大型数据。 一、逐步生成大法——迭代(递推)法 三层for循环

wwwjjjjj666的博客 1万+

LabVIEW+数据库应用系列保姆级教程,第一篇数据库连接

目录LabVIEW连接数据库的方法连接MySQL连接Oracle,SQL Server,Access等 LabVIEW连接数据库的方法 1、创建udl(Universal Data Link)是通用数据连接文件。界面操作,简单快捷。 2、编写连接字符串。需要熟悉连接字符串的结构,容易出错。 3、其他… 本教程教你使用第1种方法,也是最简单、最常用的方法。 连接MySQL 1、在MySQL Installer内安装MySQL Connector/ODBC,建议安装32位(X86),如下图: 2、创建ODBC

wwplh5520370的博客 1万+

Nexus7二代刷机教程(新手向)

该教程将使用lineageos(Android 11),同时借鉴了lineage官方的教程和songelf的教程。

2403_84391487的博客 5217

详细总结组合排列的十余种算法实现

目录 •写在前面 •问题引入 •暴力枚举 循环枚举 递归枚举 回溯枚举 •深度优先搜索 前序遍历 中序遍历 后序遍历 •字典序 •二进制位运算 •带重复数字 •总结 •写在前面 排列组合的问题,如果没有合适的算法去解决,时间复杂度会相当的大,毕竟阶乘的时间复杂度不仅让人头大,也让他计算机欲罢不能,而且我们遇到排列组合的相关问题的概率相当的大,所以非常有必要掌握...

BoCong-Deng的博客 2万+

数字IC后端设计实现OCC(On-chip Clock Controller)电路介绍及时钟树综合案例

数字IC后端设计实现OCC(On-chip Clock Controller)电路介绍及时钟树综合案例

weixin_37584728的博客 4740

经典算法之全排列

经典算法 文章目录经典算法前言一、什么全排列?二、代码实现总结 前言 就算法而言,我们主要学习的是数学+思维+逻辑+数据结构实现功能,所以我们主要学习是思维也是解决问题的思路,然后用逻辑去实现它。 提示:以下是本篇文章正文内容,下面案例可供参考 一、什么全排列? 打印一组由1,2,3,4,5组成的数,满足带有(1,2,3,4,5)这个结构的数据,使用全排列的算法实现。 让然个数都可以调整的,123456789这样都可以,改一改就可实现。 二、代码实现 public class 全排列 { pub

zhx__的博客 2158

OCC入门指南:从零开始掌握Open CASCADE Technology

本文是Open CASCADE Technology(OCC)的入门指南,详细介绍了这款开源C++三维几何建模内核的核心概念与价值。内容涵盖从零开始搭建开发环境、编写第一个显示立方体的程序,到深入理解其几何与拓扑核心、掌握Draw测试工具及Handle内存管理等关键编程范式,旨在帮助开发者快速掌握这一工业级CAD/CAE/CAM应用开发利器。

java5的博客 1276

D457深度相机调试记录(max96712+max9295A)

使用max96712解串器解4路D457相机。采集深度相机Depth和RGB流。

navy2015_163的博客 1268

求子集&全排列

求子集 给定一组不含重复元素的整数数组nums,返回该数组所有可能的子集(幂集)。 说明:解集不能包含重复的子集。 示例: 输入: nums = [1,2,3] 输出: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ] 思路 : 1、确定一个tags标记数组,用于确定某个元素是否被选择...

y649014081的博客 860

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

经典算法全排列

声明:本文思想借鉴了这位同学的博文,详细全面。对我这种初学者可以说是受益匪浅。 http://blog.youkuaiyun.com/morewindows/article/details/7370155    全排列算法可以说在题目中经常遇得到,所谓全排列指的是从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素 中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列

oHouQiZhiXiu的专栏 1024

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

每日刷题|回溯法解决全排列问题

回溯法系列刷题之全排列(*^▽^*)

B1ue还在专注 1829

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

经典算法回顾:全排列问题的递归与回溯解法

深度解析算法之穷举vs暴搜vs深搜vs回溯vs剪枝。

2301_80863610的博客 7536

Java 全排列 详解

Java 全排列 详解

T_Y_F_的博客 1896

NOJ1103全排列——经典算法

全排列 时间限制(普通/Java):1000MS/3000MS          运行内存限制:65536KByte 总提交:965            测试通过:228 描述 全排列的生成就是对于给定的字符集或数集,用有效的方法将所有可能的全排列无重复无遗漏地枚举出来。对给定的字符集中的字符规定一个先后关系,在此基础上规定两个全排列的先后是从左到右逐个比较对应的字符的先后,或根

我的博客 765

面试经典算法题93-全排列

公众号:阿Q技术站。

qq_44630255的博客 415

经典算法-全排列问题

问题:输出1,2,3三个数的全排列 import java.util.ArrayList; public class Main { static ArrayList l=new ArrayList(); //用于检查是否出现过 static boolean []b=new boolean[3]; //回溯 static void f(int []a,int end){// //一个终结条件,也就是...

PROBIE_的博客 516

JavaScript实现全排列

javascript实现全排序算法。

weixin_51422386的博客 2824

全排列题解

题目 题目链接 给定一个 没有重复 数字的序列,返回其所有可能的全排列。 示例: 输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] 实现思路 经典回溯问题,dfs深度遍历 图片来源leetcode题解 代码 class Solution { public List<List<Integer>> permute(int[] nums) {

WormholeStack 1229
上一篇: 经典算法之算式符号问题
下一篇: 百词斩面经
striner
博客等级 码龄9年 153粉丝 99原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值