刷题日记04《回溯算法》

news2024/11/14 10:29:55

回溯算法本质

回溯算法的本质是穷举,即对所有可能的情况进行一一穷举,如果求解过程中发现某个情况不符合求解要求,直接进行剪枝即可

回溯算法模板

我们可以将回溯算法理解为以下两种模板

1.递归回溯

result = []
def backtrack(路径, 选择列表):
    if 满足结束条件:
        result.add(路径)
        return
    
    for 选择 in 选择列表:
        做选择
        backtrack(路径, 选择列表)
        撤销选择

2.多叉树的遍历

void traverse(TreeNode root) {
    for (TreeNode child : root.childern) {
        // 前序位置需要的操作
        traverse(child);
        // 后序位置需要的操作
    }
}

题目实例

题目描述

力扣icon-default.png?t=N5K3https://leetcode.cn/problems/permutations/

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

解题思路

对于回溯算法的题目,我们直接修改小部分的算法策略后直接套用回溯模板即可:针对这道题目,我们的实现思路如下:对于每一层数字的排列,我们一一穷举其可能的情况,之后将可能的情况进行保存,不可能的情况直接丢弃,在可能情况的基础上进行下一层的递归遍历,在递归最后一层数字后将代码进行回溯~

代码实现

class Solution {
    //定义结果集
    private LinkedList<List<Integer>> res=new LinkedList<>();
    public List<List<Integer>> permute(int[] nums) {
        //调用递归函数
        //创建列表
        LinkedList<Integer>list=new LinkedList<>();
        reverse(list,nums);
        return res;
    }
    //创建递归函数
    public void reverse(LinkedList<Integer>list,int[]nums){
        //判断递归的终止条件
        if(list.size()==nums.length){
            //导出
            res.addLast(new LinkedList(list));
        }
        //进入递归
        for(int i=0;i<nums.length;++i){
            if(list.contains(nums[i])){
                continue;
            }
            //加入列表
            list.addLast(nums[i]);
            //递归
            reverse(list,nums);
            list.removeLast();
        }
    }
}

题目描述

N皇后问题

解题思路

N皇后问题也是直接套用模板即可:在每一层皇后的选择中遍历所有情况,将不符合条件的情况进行摒弃,继续向下一层进行递归遍历,直到满足所有情况后进行回溯即可

代码实现

public class NEmpress {
    private static final  int N=8;
    public static int process(int[]data,int i,int n){
        //定义计数器
        int res=0;
        if(i==n){
            return 1;
        }
        //进行递归遍历
        for(int j=0;j<n;++j){
            //判断当前列是否有效
            if(isValid(data,i,j)){
                data[i]=j;
            }
            //递归
          res+=process(data, i+1, n);
            //回溯
            data[i]=0;
        }
        return res;
    }

    private static boolean isValid(int[] data, int i, int j) {
        for(int k=0;k<i;++k){
            if(data[k]==j||Math.abs(i-k)==Math.abs(j-data[k])){
                return false;
            }
        }
        return true;
    }
}

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

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

相关文章

企业电子招投标系统源代码之电子招投标系统建设的重点和未来趋势+spring clould +java+二次开发

计算机与网络技术的不断发展&#xff0c;推动了社会各行业信息化的步伐。时至今日&#xff0c;电子政务、电子商务已经非常普及&#xff0c;云计算、大数据、工业4.0、“互联网”等发展理念也逐步深入人心&#xff0c;如何将传统行业与互联网科技有效结合起来&#xff0c;产生1…

港联证券:新能源汽车再迎助力 科技巨头持续加注机器人领域

上周五&#xff0c;A股再度反弹拉升&#xff0c;两市股指盘中全线走高&#xff0c;沪指突破3200点&#xff0c;深成指涨逾1%&#xff0c;创业板指一度涨超2%。截至收盘&#xff0c;沪指涨0.62%报3200.06点&#xff0c;深成指涨1.02%报11026.59点&#xff0c;创业板指涨1.6%报22…

【梦辛工作室】java实现简易消息队列处理器 可分区 分区顺序消费MxMQ

大家好哇&#xff0c;又是我&#xff0c;梦辛工作室的灵&#xff0c;最近在巩固JUC并发包&#xff0c;突然想到如果自己的应用体量不大&#xff0c;但有需要消息队列来实现应用解耦和削峰来缓解服务器突增压力&#xff0c;比如抢票时&#xff0c;突然有比较用户同时抢票&#x…

C++之GNU C的__attribute__((constructor))优先级使用(一百四十九)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

C++ 设计模式----“对象性能“模式

“对象性能”模式 面向对象很好地解决了“抽象”的问题&#xff0c;但是必不可免地要付出一定的代价。对于通常情况来讲&#xff0c;面向对象的成本大都可以忽略不计。但是某些情况&#xff0c;面向对象所带来的成本必须谨慎处理。 典型模式 Singleto Flyweighta Singlet…

51单片机笔记

51单片机笔记 一、编程区域 1.1 用户应用程序区&#xff08;AP区&#xff09; 是指用户自己编写的程序区 1.2 ISP监控程序区&#xff1a; ISP区是指芯片出厂时就已经固化在单片机内部的一段程序&#xff0c;STC单片机可以进行ISP串行下载程序&#xff0c;这就是因为芯片在出…

在Blender和Zbrush中创建激光指示器,新手硬表面建模码住!

大家好&#xff0c;今天云渲染小编给大家带来的分享是硬表面建模&#xff0c;CG艺术家Lyubov使用Blender和Zbrush创建激光指示器的幕后花絮。 介绍 我叫 Lyubov&#xff0c;来自俄罗斯圣彼得堡&#xff0c;是一名 3D 建模的初学者。虽然学习还不到一年&#xff0c;但是我对它…

etcd安装

ETCD安装 windows版本 下载 下载地址https://github.com/etcd-io/etcd/releases 安装 其实也不用安装&#xff0c;下载解压后&#xff0c;得到如下 选中etcd.exe&#xff0c;右键→属性→兼容性→以管理员身份运行此程序勾上&#xff0c;当然&#xff0c;每次运行时候右键…

kettle作业循环实现

kettle作业循环实现 使用kettle作业中的JavaScript实现作业循环&#xff0c;这里是固定循环10次 JavaScript2 parent_job.setVariable("max",10); parent_job.setVariable("count",1); true;检验字段的值 JavaScript var current parent_job.getVari…

MySQL事务+存储引擎

文章目录 MySQL事务存储引擎1 事务1.1 事务的概念1.2 事务的ACID特点1.3 导致问题1.4 事务控制语句1.4.1 查看修改隔离级别1.4.2 使用set设置控制事务1.4.3 查看事务自动提交功能 2 存储引擎2.1 存储格式2.2 常用存储引擎2.3 查看表使用的存储引擎2.4 修改存储引擎2.5 InnoDB行…

证券市场基本概念

证券市场基本概念 一、 指数分类1.1 什么是指数1.2 指数分类 二 、交易所及板块2.1 交易所及板块2.2 股票代码规则 三 、指数、ETF、股票的关系3.1 指数和股票的关系3.2 指数和指数ETF的关系3.3 ETF概念 四、 股票行业分类4.1 申万行业分类4.2 股票与申万行业分类的关系 五 、指…

idea - 插件之 codeium(安装篇)

idea - 插件之 codeium 插件官网地址&#xff1a;https://codeium.com/ Idea 版本&#xff1a;2021.3.2 关于插件作用就不多做介绍&#xff0c;接下来开始正文。 由于目前有很多博客文章没有对 Idea 安装进行详细的讲解和遇到问题的处理讲解&#xff0c;所以我经过踩坑后&am…

【C++学习】C++的动态内存管理 | new和delete的底层 | 初识模板

目录 1. C的动态内存管理 2. new和delete的底层 3. 定位new 4. new和malloc 的区别总结 5. 模板 写在最后&#xff1a; 1. C的动态内存管理 上一篇文章已经大致介绍完new和delete的用法&#xff0c; 以及C和C语言两种动态内存管理方式的区别&#xff0c;这里简单总结一…

【MMCV python安装指南】

MMCV python安装指南 MMCV 介绍安装教程1.系统环境2.python版本3.torch版本4.mmcv版本 安装示例 MMCV 介绍 mmcv 是用于计算机视觉研究的基础 Python 库&#xff0c;支持 MMLAB 中的许多研究项目&#xff0c;例如 MMDetection https://github.com/open-mmlab/mmdetection MMAct…

arc163 C 思维构造

题意&#xff1a;https://atcoder.jp/contests/arc163/tasks/arc163_c 思路&#xff1a;本题构造主要就是围绕 初始放入2&#xff0c;3&#xff0c;6&#xff0c;然后一直将一个拆解直到满足大小。 /*keep on going and never give up*/ #include<cstdio> #include<…

【择校】肠子悔青,录取分数断层,超过第二名44分,超过最后一名146分!

一、学校及专业介绍 中南民族大学&#xff08;South-Central Minzu University&#xff09;坐落于湖北省武汉市&#xff0c;中华人民共和国国家民族事务委员会直属高校&#xff0c;位列湖北省“国内一流大学建设高校”、“少数民族高层次骨干人才计划”资格高校、全国深化创新创…

15. python从入门到精通——Pygame游戏编程

目录 游戏的原理 安装Pygame Pygame常用模块 Pygame的基本使用 实例:制作一个跳跃的小球游戏&#xff0c;如果碰到窗口边缘会改变小球移动方向 实现步骤&#xff1a; 运行效果&#xff1a; 小球图片&#xff1a; python代码&#xff1a; 开发Flappy Bird游戏 …

生成古风少女图片【InsCode Stable Diffusion美图活动一期】

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​ 目录 写在前面 Stable Diffusion 模型在线使用地址&#xff1a; 工具介绍 一.如何使用S…

基于Java的酒店管理系统设计与实现(源码+文档+报告+任务书)

本系统采用Java语言进行开发&#xff0c;实现了跨平台的部署。使用了MySQL数据库进行数据存储&#xff0c;保证了数据的稳定性与可靠性。通过使用Spring框架&#xff0c;实现了对各个模块的解耦&#xff0c;使得系统更易于维护与升级。前端使用了Node.jsVue以提供易用、美观的用…

spring复习:(4)AbstractEnvironment

该类中指定了激活profile属性的名称(spring.profiles.active)&#xff0c;默认profile属性的名称(spring.profiles.default)&#xff0c;以及默认的profile的名字(default)。