Java回溯法对数字的全排列

Java实现回溯算法入门(排列+组合+子集) 回溯是递归的副产品,只要有递归就会有回溯,所以回溯法也经常和二叉树遍历,深度优先搜索混在一起,因为这两种方式都是用了递归。 回溯法 采用试错的思想,它尝试分步的去解决一个问题。在分步解决问题的过程中,当它通过尝试发现现有的分步答案不能得到有效的正确的解答的时候,它将取消上一步甚至是上几步的计算,再通过其它的可能的分步解答再次尝试寻找问题的答案。回溯法通常用最简单的递归方法来实现,在反复重复上述的步骤后可能出现两种情况: 找到一个可能存在的正确的答案; 在尝试了所有可能的分步方法后宣告该问题没有答案。 回 阅读详情


原文:https://blog.youkuaiyun.com/iloveyougirls/article/details/55044401


一、对于不重复数字的全排列(例如:1,2,3,4,5,7,8,9)

1.用数学的方法来算很简单,排列的结果是9!种情况;

下面是简单的一个代码的例子:
[java]  view plain  copy
  1. public class Main {  
  2.     static int count = 0;  
  3.     public static void main(String[] args) {  
  4.         int[] a = {1,2,3};  
  5.         test(a,0);  
  6.         System.out.println(count);  
  7.     }  
  8.     public static void test(int[] a,int b){  
  9.         if(b>=a.length){  
  10.             count++;  
  11.             System.out.println(java.util.Arrays.toString(a));  
  12.         }  
  13.         for (int i = b; i < a.length; i++) {  
  14.             {int k = a[b];a[b] = a[i];a[i] = k;}//两个数字,进行交换  
  15.             test(a,b+1);//用递归进行下一个数的交换  
  16.             {int k = a[b];a[b] = a[i];a[i] = k;}//再次交换两个数字,换回来  
  17.         }  
  18.     }  
  19. }  

输出结果:

[1, 2, 3]
[1, 3, 2]
[2, 1, 3]
[2, 3, 1]
[3, 2, 1]
[3, 1, 2]
6

二、有些时候,有重复的数字进行排列组合(例如:1,2,2)

这样的数字比较少的,很简单一眼就能看得出有3种情况的排列;

把上面的代码稍做判断就可以的到重复数字的全排列:

[java]  view plain  copy
  1. public class Main {  
  2.     static int count = 0;  
  3.     public static void main(String[] args) {  
  4.         int[] a = {1,2,2};  
  5.         test(a,0);  
  6.         System.out.println(count);  
  7.     }  
  8.     public static void test(int[] a,int b){  
  9.         if(b>=a.length){  
  10.             count++;  
  11.             System.out.println(java.util.Arrays.toString(a));  
  12.         }  
  13.         for (int i = b; i < a.length; i++) {  
  14.             if(!is(a,b,i)) continue;   
  15.             {int k = a[b];  
  16.             a[b] = a[i];  
  17.             a[i] = k;}  
  18.             test(a,b+1);  
  19.             {int k = a[b];  
  20.             a[b] = a[i];  
  21.             a[i] = k;}  
  22.         }  
  23.     }  
  24.     /*排除重复情况的组合*/  
  25.     public static boolean is(int[] a,int b,int i){  
  26.         for (int j = b; j < i; j++) {  
  27.             if(a[i]==a[j]){  
  28.                 return false;  
  29.             }  
  30.         }  
  31.         return true;  
  32.     }  
  33. }  

输出结果:

[1, 2, 2]
[2, 1, 2]
[2, 2, 1]
3



3.2 回溯法—全排列 1. 问题描述 给定一个不含重复数字的数组 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: 输入:nums = [0,1] 输出:[[0,1],[1,0]] 示例 3: 输入:nums = [1] 输出:[[1]] 2. 问题分析 class Solution { //使用一个动态数组保存所有可能的全排列 阅读详情

相关推荐

SystemVerilog新手实战指南:iverilog与VScode的完美组合

本文为SystemVerilog新手提供了一套高效入门方案,详细介绍了如何利用开源编译器iverilog与轻量编辑器VScode搭建学习环境。内容涵盖十分钟快速安装配置、首个工程从编码到查看波形的完整流程,并演示了动态数组和队列等SystemVerilog新特性的使用,旨在帮助初学者避开复杂商业工具,快速掌握数字电路设计与验证的核心技能。

f6g7h8i9j的博客 513

力扣46. 全排列(java 回溯法)

力扣46. 全排列(java 回溯法)

LNsupermali的博客 1307

uniapp运行钉钉小程序

因项目原因,公司需要在钉钉里面开发小程序。之前用uniapp开发过app,H5,小程序。还真没尝试过钉钉小程序,今天就简单的记录下uniapp运行钉钉小程序中的过程。

YL 2919

全排列(java实现、递归、回溯、含详细原理图)

【代码】全排列(java实现)

Cap07博客 648

在Qt中使用EtherCAT-SOEM的初始化中,状态机卡在PreOp->Save-Op过程中,出现State=0x12, Error=0x001e错误的解决办法

1.在调试EtherCAT软件过程中,一直出现配置从站进不了Save_op状态,通过下函数检查从站状态: //使用的从站编号为1 只有1个从站 ec_slave[1].state = EC_STATE_SAFE_OP; ec_writestate(1); //设置到安全模式 ec_statecheck(1, EC_STATE_SAFE_OP, EC_TIMEOUTSTATE * 4); printf("Slave %d State=0x%2.2x StatusCode=0x%4

zeal_for_rov的博客 6826

TC8工作原理

OPEN组织由全世界主要整车厂和供应商组成,旨在推广以太网技术在车辆中的应用。OPEN下属多个技术委员会(Tech Committee,简称TC),对不同方面的技术细节进行量化定义,并发布相应规范。其中TC8规范包括车载以太网ECU从物理层到应用层的各层互操作性以及常规基础功能服务,目的在于提高不同ECU之间的兼容性 UpperTester UpperTester作为Tester与DUT的被测核心功能模块之间的中介,辅助完成测试。UpperTester的主要功能包括: 与Tester就测试模式切换/请.

jasonj333 5321

回溯算法简单介绍

转载自labuladong微信公众号,侵权删。 废话不多说,直接上回溯算法框架。解决一个回溯问题,实际上就是一个决策树的遍历过程。你只需要思考 3 个问题: 1、路径:也就是已经做出的选择。 2、选择列表:也就是你当前可以做的选择。 3、结束条件:也就是到达决策树底层,无法再做选择的条件。 如果你不理解这三个词语的解释,没关系,我们后面会用「全排列」和「N 皇后问题」这两个经典的回溯算法问题来帮你...

熊伟 941

【人工智能】架构演进:基于本体论与 LLM Agent 的供应链备件决策闭环实践

本文探讨了如何将本体论(Ontology)与大语言模型(LLM)Agent结合,构建供应链备件管理的智能决策系统。针对LLM在垂直领域存在的幻觉和逻辑缺陷问题,提出通过本体论建立结构化知识框架,形成四层架构:知识建模、动态感知、深度分析和决策闭环。系统利用图数据库实例化领域本体,融合多源数据实现实时感知,结合图谱推理和时序预测进行确定性分析,最终通过工具调用完成决策执行。技术选型推荐Gemini 1.5 Pro、Neo4j和LangChain等工具,实现从自动化到智能化的升级。该架构为工业领域提供了可解释、

奶爸的编程之路,也就一周冷个三天 168

【回溯法】全排列问题

回溯法求全排列

liuwanqing233333的博客 748

计算机组成原理(第三版)唐朔飞-第七章指令系统-课后习题

机器字长是指CPU一次能处理数据的位数通常与CPU的寄存器位数有关。指令字长是指机器指令中二进制代码的总位数。存储字长是指存储单元中存放二进制代码的总位数。三者可以相等也可以不等视不同机器而定。答:OP(4位)A1(6位)A_1(6位)A1​(6位)A2(6位)A_2(6位)A2​(6位)设二地址指令格式为该指令系统的基本格式,4位操作码共有16种编码,其中13种用来定义二地址指令,还剩3种可用作扩展标志。一地址指令条数=3∗26=192。

weixin_45735391的博客 7万+

1.2 amdgpu_bo的设计分析 — gem层和ttm层

本文分析了AMD KFD的BO设计架构,重点介绍了DRM子系统中缓冲对象的多层继承关系。文章首先展示了核心继承层次图,包括DRM通用层(drm_gem_object)、TTM内存管理层(ttm_buffer_object)、AMD驱动层(amdgpu_bo)和KFD计算层(kgd_mem)。随后详细解析了drm_gem_object结构体的关键功能,包括用户空间接口管理、内存映射支持、引用计数机制以及DMA-BUF导入/导出功能。

图形/计算GPU的驱动与虚拟化技术分享园地 2537

可视化图解算法55:有重复项数字的全排列

对于数据结构与算法,我们总结了一套【可视化+图解】方法,依据此方法来解决相关问题,算法变得易于理解,写出来的代码可读性高也不容易出错。

weixin_42117918的博客 959

动力学约束下的运动规划算法——状态栅格规划器(State Lattice Planner)

A*、RRT等算法建立的用于路径搜索的图模型是不考虑机器人的动力学约束的,其构建的图模型的两个相邻节点之间的路径可能是不可行的,或者很难被机器人跟踪的,现在我们想要使得图中相邻两个节点间的连接是一种满足动力学约束的可行的连接,那么如何构建一个这样的图呢? 构建这样的图通常有两种方法:第一种是基于控制空间的采样(正向方法)

慕羽★的博客 3104

java解决全排列问题

给定一个可包含重复数字的序列 nums ,按任意顺序返回所有不重复的全排列。我们把问题看成n个排列成一行的空格,从左往右依次填入给定的n个数,每个数只能使用一次,可以使用回溯法。递归函数backtrack(idx, perm)表示当前排列为perm,下一个待填入的位置是第idx个位置,下标从0开始。(1)如果idx == n,说明填完了n个位置,找到了一个可行解,把perm放入结果数组中,递归结束;(2)如果idx < n,需要考虑第idx个位置填那个数。

快乐江小鱼的博客 790

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

剑指leetcode—(待更新)全排列||

题目描述: 给定一个可包含重复数字的序列,返回所有不重复的全排列。 示例: 输入: [1,1,2] 输出: [ [1,1,2], [1,2,1], [2,1,1] ] 根据题目意思,序列中包含重复数字,但是返回所有不重复的全排列。 由于今天有其他事情需要做,就不总结了可以参考大佬写的回溯加剪枝 java语言实现 class Solution { List<List<Integer>> res = new LinkedList<>(); /* 主函数,输入一组不.

super_优快云er的博客 230

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Leetcode46-全排列详解

Leetcode46-全排列详解

白羊by的博客 794

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

[美团] 0822笔试 1 小美的数字卡片(含重复数的全排列)

全排列II:https://leetcode-cn.com/problems/permutations-ii/ n张数字卡片,在可以任意排列的情况下,能排列出多少中不同的排列,并按照字典序写出每种排列的方式。 例1: [1, 2, 3]共有6种排列方式,分别为 [1,2,3]、[1,3,2]、[2,1,3]、[2,3,1]、[3,1,2]、[3,2,1]。 [2, 2, 3]共有3种排列方式,分别为 [2,2,3]、[2,3,2]、[3,2,2]。 两个排列不同,当且仅当至少存在一个位置pos,两

柚子 810

46 47全排列

全排列 给定一个不含重复数字的数组 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: 输入:nums = [0,1] 输出:[[0,1],[1,0]] 示例 3: 输入:nums = [1] 输出:[[1]] public List<List<Integer>> permute(int[] nu.

LHH的博客 133

JAVA--全排列输出--带动态图

import java.util.Scanner; public class P1546 { int n; int[] A; boolean[] Mark; public P1546() { Scanner sc=new Scanner(System.in); n=sc.nextInt(); A=new int[n]; Mark=new boolean[n+1]; Perm...

RAVANLALA 391

【算法】Java蓝桥杯试题练习 算法训练组 《数字游戏》(回溯法)

关于蓝桥杯官网的算法训练组中的一道题目《数字游戏》的Java的回溯解法。 题目链接 :蓝桥杯算法训练

CodeCodeBond的博客 806

LeetCode:46. 全排列

问题描述(原题链接)   给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 代码: class Solution { public List<List<Integer>> permute(int[] nums) { //回溯去重 int len = nums.length; List<List<Integer>> res = new ArrayList

qq_40859392的博客 167

lintcode--全排列

给定一个数字列表,返回其所有可能的排列。  注意事项 你可以假设没有重复数字。 您在真实的面试中是否遇到过这个题?  Yes 样例 给出一个列表[1,2,3],其全排列为: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] //

wenyunlei520的博客 313

数据结构与算法-回溯-全排列

给定一个不含重复数字的数组。

weixin_43039757的博客 89

java实现全排列(无重复)

全排列 全排列就是将一串数字排列组合 列出所有的情况,分成有重复的和无重复的,一般来说没有重复数字的比有重复数字的更难的一些,不过大体思路都差不多,都需要用到回溯算法 整体思路: 1.就是把数字一个一个遍历,发现符合条件就加进去,不符合条件的就跳出去,那么这个容器就用ArrayList的形式 那么代码就是:· public class number{ static ArrayList<String> w = new ArrayList();//符合条件的一组,就往里面装,装的是String类型

小海同学的博客 2486

leetCode46. 全排列

全排列题目: 全排列(Java)内容用例思路AC代码提交记录 题目: 全排列(Java) 内容 链接: 全排列 给定一个没有重复数字的序列,返回其所有可能的全排列。 用例 示例 1: 输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] 思路 两种思路 1、回溯法。 AC代码 class Solu...

默默无闻的博客 319
上一篇: 贪心算法_01背包问题_Java实现
下一篇: 回溯法----旅行售货员问题java算法
还不够
博客等级 码龄16年 113粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值