首页 > 其他分享 >回溯之全排列

回溯之全排列

时间:2024-04-10 22:01:09浏览次数:32  
标签:arr 排列 LinkedList backtrack track 之全 选择 回溯

前言

回溯算法是一种通过逐步构建解决方案来解决问题的方法。全排列问题是其中一个经典的应用之一。它的基本思想是尝试所有可能的排列方式,并逐步构建解决方案,如果发现当前尝试的排列不符合条件,则回溯到上一步,尝试其他可能的选择。

回溯算法本质就是DFS,深搜。

全排列就是可以画成一棵树。有三个概念要清楚。选择列表 路径 结束条件

选择列表指的是在每一步中可以做出的选择,即当前可用的候选元素或者决策。在全排列问题中,选择列表就是尚未被选取的数组元素。

路径指的是当前已经做出的选择,即当前已经形成的部分排列。在全排列问题中,路径就是当前已经选择的一组元素。

结束条件就是路径数组大小和所需排列的数组大小相等
在这里插入图片描述
做选择指的是在某一步中从选择列表中选择一个元素,并将其添加到当前的路径中。这个选择可能是选择某个元素作为当前排列的下一个元素,或者是选择某个分支作为当前的搜索方向。在全排列问题中,做选择就是从尚未被选择的元素中选择一个添加到当前排列中。

撤销选择指的是在某一步中,当发现当前的选择导致了不符合要求的情况,或者已经达到了结束条件,需要回溯到上一步的状态,取消之前所做的选择,以便尝试其他的选择。在全排列问题中,撤销选择就是将最近添加到路径中的元素移除,以回到之前的状态。
在这里插入图片描述

全排列代码如下(java代码)

	//数字全排列
    public static void backtrack(int[] arr, LinkedList<Integer> track) {
        if (track.size() == arr.length) {
            //可以搜集结果 这里就仅打印看看效果
            System.out.println(track);
            return;
        }
        for (int i = 0; i < arr.length; i++) {
            //可选择的是在路径中未出现过的
            if (track.contains(arr[i])) {
                continue;
            }
            track.add(arr[i]);//做选择
            backtrack(arr, track);
            track.removeLast();//取消选择
        }
    }

    public static void main(String[] args) {
        int[] arr = {1, 2, 3};
        LinkedList<Integer> track = new LinkedList<>();
        backtrack(arr, track);
    }

结果:
在这里插入图片描述

	//字符全排列
    public static void backtrack(char[] arr, LinkedList<Character> track) {
        if (track.size() == arr.length) {
            //可以搜集结果 这里就仅打印看看效果
            System.out.println(track);
            return;
        }
        for (int i = 0; i < arr.length; i++) {
            //可选择的是在路径中未出现过的
            if (track.contains(arr[i])) {
                continue;
            }
            track.add(arr[i]);//做选择
            backtrack(arr, track);
            track.removeLast();//取消选择
        }
    }

    public static void main(String[] args) {
        char[] arr = {'a', 'b', 'c'};
        LinkedList<Character> track = new LinkedList<>();
        backtrack(arr, track);
    }

结果:
在这里插入图片描述

小结

全排列问题,其实只要记住了这个思路和套路,重点:明白选择列表 路径 结束条件,基本上要写出来都没问题,万变不离其宗


图参考:https://blog.51cto.com/u_15295608/3008226


觉得有用就点个赞吧,谢谢

标签:arr,排列,LinkedList,backtrack,track,之全,选择,回溯
From: https://blog.csdn.net/m0_64289188/article/details/137427215

相关文章

  • 2024-04-10:用go语言,考虑一个非负整数数组 A, 如果数组中相邻元素之和为完全平方数,我们
    2024-04-10:用go语言,考虑一个非负整数数组A,如果数组中相邻元素之和为完全平方数,我们称这个数组是正方形数组。现在要计算A的正方形排列的数量。两个排列A1和A2被认为是不同的,如果存在至少一个索引i,满足A1[i]!=A2[i]。输入:[1,17,8]。输出:2。答案2024-04-10:来自左......
  • 全排列价值(数学问题)
     1importjava.util.*;23publicclassDemo1{4publicstaticvoidmain(String[]args){5Scannersc=newScanner(System.in);6longn;7n=sc.nextLong();8longres=n*(n-1)/2%998244353;9for(in......
  • js 常用数组函数 join() 拼接, push()尾部添加、pop()移除最后一项、shift()删除第一项
    js常用数组函数join()拼接,push()尾部添加、pop()移除最后一项、shift()删除第一项、unshift()头部添加、sort()小到大顺序排列、slice()截取获取新数组、splice()分隔截取数组、concat()连接、reverse()反转文章目录1.join()函数2.push()函数3.pop()函数4.sh......
  • LeetCode题练习与总结:排列序列--60
    一、题目描述给出集合 [1,2,3,...,n],其所有元素共有 n!种排列。按大小顺序列出所有排列情况,并一一标记,当 n=3时,所有排列如下:"123""132""213""231""312""321"给定 n和 k,返回第 k 个排列。示例1:输入:n=3,k=3输出:"213"示例2:输入:n=4,k=......
  • 蓝桥杯2014国A-排列序数(待续)
    [蓝桥杯2014国A]排列序数题目描述如果用abcd这\(4\)个字母组成一个串,有\(4!=24\)种,如果把它们排个序,每个串都对应一个序号:abcd0abdc1acbd2acdb3adbc4adcb5bacd6badc7bcad8bcda9bdac10bdca11cabd......
  • 排列型枚举(全排列)
    0.简介在排列型枚举中,我们从给定的元素集合中选择出若干个元素的所有可能排列,这些排列考虑了元素的顺序.1.代码模板#include<bits/stdc++.h>usingnamespacestd;intn;intorder[20];boolchosen[20];//x代表当前选择位voidDFS(intx){ //选满了 if(x==n+1......
  • WPF开发一个可以自适应排列的Panel控件
    一.控件介绍    初看标题可能无法理解,我们看看什么是自适应排列。乍一看它有点像WrapPanel控件,都是从左至右排列,如果一行排列不下就换行继续排列,但是细看你就会发现不对,WrapPanel控件行尾是不会对齐的,也就是说只要WrapPanel的子控件的宽度不一致,每一行的末尾就会必定留下一......
  • QT和C++排列组合
    界面比较简洁,如有需要请大家自行完善!!!头文件#pragmaonce#include<QtWidgets/QMainWindow>#include"ui_text.h"classtext:publicQMainWindow{  Q_OBJECTpublic:  text(QWidget*parent=nullptr);  ~text();  voidParseStringToVector(con......
  • C++数据结构与算法——回溯算法组合问题
    C++第二阶段——数据结构和算法,之前学过一点点数据结构,当时是基于Python来学习的,现在基于C++查漏补缺,尤其是树的部分。这一部分计划一个月,主要利用代码随想录来学习,刷题使用力扣网站,不定时更新,欢迎关注!文章目录一、77.组合二、216.组合总和III三、17.电话号码的字......
  • 【三十五】【算法分析与设计】综合练习(2),22。 括号生成,77。 组合,494。 目标和,模拟树递
    22.括号生成数字n代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合。示例1:输入:n=3输出:["((()))","(()())","(())()","()(())","()()()"]示例2:输入:n=1输出:["()"]提示:1<=n<=8【三十五】【算法分析与设计】综合练习(2),......