基础算法-回溯算法-案例

news2024/12/24 20:57:37

现象:

基础算法-回溯算法-案例

  • 基础算法-回溯算法
  • 从不同角度出发 去寻找答案 找到答案或者走不通了(根据需求:找一个答案还是列举全部答案) 则回溯返回
  • 继续从下一条路出发 去寻找答案, 一直到走完

常见案例:

案例一:
通过输入一个不重复数组如:[1,2,3]
使用数组中的元素不重复排列组成不同数组如 {1,2,3}{1,3,2},{2,1,3},{2,3,1},{3,1,2},{3,2,1}

在这里插入图片描述

  • 思路:
    • 第一步: 第一层: 先循环数组,将数组第一个元素放临时list,临时数组=[1]
    • 第二步: 递归调用在第二层, 在循环中,数组中下一个不重复元素放入临时数组,临时数组=[1,2]
    • 第四步: 递归调用在第三层, 在循环中,数组中下一个不重复元素放入临时数组,临时数组=[1,2,3] 此时第三次迭代的循环已经走完
    • 第五步: 递归调用在第四层, 此时判断临时数组的长度满足要求了,将临时数组结果放最终结果集,跳出这次递推,回到第三层递推函数
    • 第六步: 回到第三层, 此时循环已经走完,执行第三层的回溯删除,移除临时数组最后一个元素,临时数组=[1,2] 此时第三层迭代函数走完
    • 第七步: 回到第二层, 执行回溯删除,移除数组最后一个元素,临时数组=[1]
    • 第八步: 第二层, 循环继续,在循环中,数组中下一个元素放临时数组,临时数组=[1,3]
    • 第九步: 递归调用进入第三层, 在循环中,数组下一个不重复元素放入临时数组,临时数组=[1,3,2]
    • 第十步: 递归调用进入第四层, 此时判断临时数组的长度满足要求了,将临时数组结果放最终结果集,跳出这次递推,回到第三层递推函数
    • 第十一步: 回到第三层, 此时循环已经走完,执行第三层的回溯删除,移除临时数组最后一个元素,临时数组=[1,3] 此时第三层迭代函数走完
    • 第十二步: 回到第二层, 执行回溯删除,移除数组最后一个元素,临时数组=[1],此时第二层函数循环走完
    • 第十三步: 回到第一层, 执行回溯删除,移除数组最后一个元素,临时数组=[0] 此时完成了第一层的第一次迭循环,临时数组也清空了
    • 第十四步: 第一层: 继续执行第一层的循环,将数组第二个元素放list 临时数组=[2]
    • 继续执行第二…到…第十三步 一直到最外层循环走完,所有结果都将存放在结果集,临时数组也清空状态

代码方法:


    /** 最终结果存放容器 */
    static List<List<Integer>> result = new ArrayList<>();


    public static void main(String[] args){
        int[] a ={1,2,3};
        arrList(a, new ArrayList<>());

        for (List<Integer> list: result) {
            log.debug("list:{}",list);
        }
    }

    /**
     * 通过输入一个不重复数组
     * 使用数组中的元素不重复排列组成不同数组
     *
     * 思路:
     * 第一步: 第一层: 先循环数组,将数组第一个元素放临时list,临时数组=[1]
     * 第二步: 递归调用在第二层, 在循环中,数组中下一个不重复元素放入临时数组,临时数组=[1,2]
     * 第四步: 递归调用在第三层, 在循环中,数组中下一个不重复元素放入临时数组,临时数组=[1,2,3] 此时第三次迭代的循环已经走完
     * 第五步: 递归调用在第四层, 此时判断临时数组的长度满足要求了,将临时数组结果放最终结果集,跳出这次递推,回到第三层递推函数
     * 第六步: 回到第三层, 此时循环已经走完,执行第三层的回溯删除,移除临时数组最后一个元素,临时数组=[1,2] 此时第三层迭代函数走完
     * 第七步: 回到第二层, 执行回溯删除,移除数组最后一个元素,临时数组=[1]
     * 第八步: 第二层, 循环继续,在循环中,数组中下一个元素放临时数组,临时数组=[1,3]
     * 第九步: 递归调用进入第三层, 在循环中,数组下一个不重复元素放入临时数组,临时数组=[1,3,2]
     * 第十步: 递归调用进入第四层, 此时判断临时数组的长度满足要求了,将临时数组结果放最终结果集,跳出这次递推,回到第三层递推函数
     * 第十一步: 回到第三层, 此时循环已经走完,执行第三层的回溯删除,移除临时数组最后一个元素,临时数组=[1,3] 此时第三层迭代函数走完
     * 第十二步: 回到第二层, 执行回溯删除,移除数组最后一个元素,临时数组=[1],此时第二层函数循环走完
     * 第十三步: 回到第一层, 执行回溯删除,移除数组最后一个元素,临时数组=[0]  此时完成了第一层的第一次迭循环,临时数组也清空了
     *
     * 第十四步: 第一层: 继续执行第一层的循环,将数组第二个元素放list 临时数组=[2]
     * 继续执行第二...到...第十三步 一直到最外层循环走完,所有结果都将存放在结果集,临时数组也清空状态
     *
     */
    public static void arrList(int[] arr, List<Integer> list){

        // 定义一个临时list 接受入参list
        List<Integer> tempList=new ArrayList<>(list);

        if(tempList.size()==arr.length){
            // 临时list长度满足要求了 放最终结果集
            result.add(tempList);
            // 返回这次递归 回到上次递归的循环中 执行上一层回溯remove删除方法
            return;
        }

        for (int i=0;i<=arr.length-1;i++){
            // 控制元素不能重复
            if(tempList.contains(arr[i])){
                continue;
            }
            tempList.add(arr[i]);
            // 递归调用
            arrList(arr,tempList);
            // 回溯关键:每次循环走完 就开始逐步减少最后一个元素
            tempList.remove(tempList.size()-1);
        }

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1181646.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

找到【SVM】中最优的惩罚项系数C

因为本来SVM是想找到间隔最大的分割面&#xff0c;所以C越大&#xff0c;SVC会选择边际更小的&#xff0c;能够更好的分类所有训练点的决策边界&#xff0c;不过模型的训练时间也会越长。如果C的设定值较小&#xff0c;那SVC会尽量最大化边界&#xff0c;决策功能会更简单&…

4.求1000以内的所有完数

#include<stdio.h> // 完数&#xff1a;一个数的所有的真因子 (即除了自身以外的约数)的和&#xff0c;恰好等于它自身 // 1 不是完数 // 4的因子&#xff1a;1 2 4 除了本身 4 不等于 1&#xff0b;2 所以4不是完数void fun(void){int sum,i,j;for(i2;i<1000;i)…

架构师必备-DDD之落地实践

1. 走进 DDD 1.1 为什么要用 DDD &#xff1f; 面向对象设计&#xff0c;数据行为绑定&#xff0c;告别贫血模型&#xff1b;降低复杂度&#xff0c;分而治之&#xff1b;优先考虑领域模型&#xff0c;而不是切割数据和行为&#xff1b;准确传达业务规则&#xff0c;业务优先…

Unity中Shader再议ATTENUATION

文章目录 前言一、实现实时阴影的投射1、直接复制之前实现投射阴影的Pass 二、实现实时阴影的接受&#xff0c;同时实现光照衰减1、在 v2f 中使用这个2、在 顶点着色器 中使用这个3、在 片元着色器 中使用这个 前言 在之前文章中&#xff0c;实现了 Global Illumination 的直接…

python 之切片

文章目录 基本切片语法负索引step 为负使用负数的 Step从右向左提取间隔提取 注意事项切片的应用切片运用到字符串、元组、range对象字符串切片基本字符串切片使用步长进行操作 元组切片基本元组切片使用步长进行操作 range 对象切片基本 range 切片使用步长进行操作 在 Python…

SPSS两变量相关性分析

1.两变量相关性分析 两变量相关性分析是统计学中用于评估两个变量之间是否存在线性关系以及关系紧密程度的一种方法。相关性的大小通常使用相关系数来衡量&#xff0c;最常用的是皮尔逊相关系数&#xff08;Pearson correlation coefficient&#xff09;&#xff0c;但还有斯皮…

简单讲讲RISC-V跳转指令基于具体场景的实现

背景 在 RISC-V指令集中&#xff0c;一共有 6 条有条件跳转指令&#xff0c;分别是 beq、bne、blt、bltu、bge、bgeu。如下是它们的定义与接口 BEQ rs1, rs2, imm ≠ BNE rs1, rs2, imm &#xff1c; BLT rs1, rs2, imm ≥ BGE rs1, rs2, imm < unsigned BLTU rs1…

Stable Diffusion源码调试(二)

Stable Diffusion源码调试&#xff08;二&#xff09; 个人模型主页&#xff1a;https://liblib.ai/userpage/369b11c9952245e28ea8d107ed9c2746/model Stable Diffusion版本&#xff1a;https://github.com/AUTOMATIC1111/stable-diffusion-webui/releases/tag/v1.4.1 分析S…

汽车标定技术(五)--基于模型开发如何生成完整的A2L文件(1)

1 数据对象的创建 CtrlH打开Model Explorer&#xff0c;在Base workspace中点击工具栏add&#xff0c;出现如下界面&#xff0c; 可以看到Simulink提供了多种数据类型 Matlab Variable&#xff1a;Simulink.Parameter&#xff1a;使用该数据对象表示工程应用中的标定量Simuli…

python爬虫怎么翻页 ?

首先&#xff0c;你需要安装相关的库。在你的命令行窗口中&#xff0c;输入以下命令来安装所需的库&#xff1a; pip install requests beautifulsoup4然后&#xff0c;你可以使用以下代码来爬取网页内容并翻页&#xff1a; package mainimport ("fmt""net/htt…

DAY 12 结构体 共用体 枚举02

1.结构体 结构体对齐(了解) 概述 typedef struct Data01 { char a; int b; }Data01; typedef struct Data02 { char a; char b; }Data02; void fun01(){ printf("%ld\n",sizeof(Data01)); printf("%ld\n",sizeof(Data02)); } 特点&#xff…

QuantLib学习笔记——一个简单的价值估算案例

⭐️ 前言 QuantLib很强大&#xff0c;它实现了很多金融工具及其价值估算方法&#xff0c;从最简单的折现模型&#xff0c;到利用BSM模型对期权进行定价&#xff0c;覆盖面相当齐全。本文以一个简单的净现值估算案例&#xff0c;开启笔者金融工具估值的旅程。 开上豪车&#…

〔003〕虚幻 UE5 基础教程和蓝图入门

✨ 目录 &#x1f388; 新建项目&#x1f388; 快捷操作&#x1f388; 镜头移动速度&#x1f388; 新建蓝图关卡&#x1f388; 打印字符串&#x1f388; 蓝图的快捷键&#x1f388; 场景中放置物体&#x1f388; 通过蓝图改变物体位置&#x1f388; 展现物体运动轨迹&#x1f3…

泛微移动管理平台E-mobile lang2sql接口任意文件上传漏洞

一、漏洞描述 泛微e-mobile,由高端OA泛微专业研发,是业内领先的移动OA系统,提供移动审批,移动考勤,移动报表,企业微信等丰富办公应用,支持多种平台运行,灵活易用安全性高。 e-mobile可满足企业日常管理中的绝大部分管理需求&#xff0c; 诸如市场销售、项目、采购、研发、客服…

了解高防服务器的工作原理

在当今互联网时代&#xff0c;网络安全问题日益突出&#xff0c;各种网络攻击层出不穷。为了保护企业的网络安全&#xff0c;高防服务器应运而生。那么&#xff0c;你是否了解高防服务器的工作原理呢?下面就让我们一起来探索一下。 高防服务器是一种能够有效抵御各种网络攻击的…

“小众”与“竞争”:打造爆款新能源车型的两大方法

引言&#xff1a;在动荡的新能源汽车市场中,品牌如何从众多竞争者中脱颖而出,捕捉消费者的心呢?是否是从广袤的"主流"市场着手,还是从具有潜力的”小众"市场切入?或者,是否需要重新定义与既定的竞争者进行正面对抗的方式? 在新能源汽车翻涌的市场潮流中&…

利用浩客无代码开发API集成客服系统,提升用户服务质量

【浩客简介】 浩客&#xff0c;是由十年 SaaS 表单产品「金数据」团队打造的新产品。它主要面向数字化系统的用户评价、反馈、调研、通知工具&#xff0c;特定时机、精准触达&#xff0c;帮助产品经理、用研、UX、运营&#xff0c;聆听用户心声&#xff0c;增强用户触达&#…

【软件设计师 - 一周通关】1.考试介绍

目录 一、简介 考试项目 1、证书作用 &#xff08;1&#xff09;以考代评中高级职称 &#xff08;2&#xff09;一线城市人才引进落户 &#xff08;3&#xff09;就业优势 &#xff08;4&#xff09;个税抵扣 &#xff08;5&#xff09;技能补贴 2、含金量 3、报名时…

网络原理---拿捏传输层:TCP/UDP协议

文章目录 UDP协议源端口、目的端口UDP长度校验和 TCP协议源端口、目的端口4位首部长度、选项保留位&#xff1a;6位6个特殊标志位32位序号、32位确认序号&#xff1a;在确认应答机制中使用16位窗口大小&#xff1a;在流量控制机制中使用16位校验和 TCP协议 VS UDP协议 在本篇中…