代码随想录第26天|回溯part6 不需要搜索整棵树的回溯二维搜索

news2024/11/25 20:17:26

332.重新安排行程

在这里插入图片描述
难题,自己写的代码没过,但我认为逻辑没有问题

class Solution {
public:
    vector<string> res;
    bool pruning(vector<string> res, vector<string> path) {
        if (res.size() == 0)
            return true;
        bool check = false;
        for (int i = 0; i < path.size(); i++) {
            if (path[i] <= res[i])
                check = true;
            // 如果是第一次字典序就比res大,那么就可以剪枝
            if(path[i] > res[i] && !check)
                return false;
        }
        return true;
    }
    bool compare(vector<string> res, vector<string> path) {
        if (res.size() == 0)
            return true;
        for(int i = 0;i<res.size(); i++){
            if(path[i] == res[i]) continue;
            else if(path[i] < res[i]) return true;
            else return false;
        }
        return true;
    }
    void backTracking(vector<vector<string>>& tickets, vector<bool>& used,
                      vector<string>& path) {
        if (path.size() == tickets.size() + 1) {
            if (compare(res, path)) {
                res = path;
            }
            return;
        }
        for (int i = 0; i < tickets.size(); i++) {
            if (used[i])
                continue;
            if (path[path.size() - 1] != tickets[i][0])
                continue;
            path.push_back(tickets[i][1]);
            if (!pruning(res, path)) {
                path.pop_back();
                continue;
            }
            used[i] = true;
            backTracking(tickets, used, path);
            used[i] = false;
            path.pop_back();
        }
    }
    vector<string> findItinerary(vector<vector<string>>& tickets) {
        for (int i = 0; i < tickets.size(); i++) {
            if (tickets[i][0] != "JFK")
                continue;
            vector<bool> used(tickets.size(), false);
            vector<string> path;
            path.push_back(tickets[i][0]);
            path.push_back(tickets[i][1]);
            used[i] = true;
            backTracking(tickets, used, path);
            used[i] = false;
        }
        return res;
    }
};

正确的方法应该是使用一个map记录某个点到另一个点的机票数,类似于used数组的作用,但是如果使用map记录,因为map本身是有序的,所以在遍历的时候,第一个满足条件的一定是最小的路径。
终止条件就是字符串数比票数多1的时候。
这里返回值使用bool类型,当找到第一个符合条件的时候,直接返回true就行,然后它会一直返回给上层,直接退出函数,此时res是找到的第一个符合条件的路径,又因为map是自然有序的,所以res内就是答案

class Solution {
public:
    unordered_map<string, map<string, int>> targets;
    bool backTracking(vector<vector<string>>& tickets, vector<string>& res) {
        if (res.size() == tickets.size() + 1) {
            return true;
        }
        // map是有序的,所以先遍历的string字典序小,优先按小路线走
        for (auto& target : targets[res[res.size() - 1]]) {
            if (target.second > 0) {
                res.push_back(target.first);
                target.second--;
                if (backTracking(tickets, res))
                    return true;
                res.pop_back();
                target.second++;
            }
        }
        return false;
    }
    vector<string> findItinerary(vector<vector<string>>& tickets) {
        vector<string> res;
        for (int i = 0; i < tickets.size(); i++) {
            string first = tickets[i][0];
            string second = tickets[i][1];
            targets[first][second]++;
        }
        res.push_back("JFK");
        backTracking(tickets, res);
        return res;
    }
};

51.N皇后

在这里插入图片描述
难点在于斜线上的判断
棋盘需要初始化,全为.
代码里是每次遍历一行,其实从左向右遍历每一列放棋子也是可以的
棋盘的宽度就是递归树的宽度,棋盘的高度就是递归树的深度

class Solution {
public:
    vector<vector<string>> res;
    bool check(int row, int col, vector<string>& board, int n) {
        // 检查列
        for (int i = 0; i < row; i++) {
            if (board[i][col] == 'Q')
                return false;
        }
        // 检查左斜上方
        for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) {
            if (board[i][j] == 'Q')
                return false;
        }
        // 检查右斜上方
        for (int i = row - 1, j = col + 1; i >= 0 && j < n; i--, j++) {
            if (board[i][j] == 'Q')
                return false;
        }
        return true;
    }
    void backTracking(int row, int n, vector<string>& board) {
        if (row == n) {
            res.push_back(board);
            return;
        }
        for (int i = 0; i < n; i++) {
            if (!check(row, i, board, n))
                continue;
            board[row][i] = 'Q';
            backTracking(row + 1, n, board);
            board[row][i] = '.';
        }
    }
    vector<vector<string>> solveNQueens(int n) {
        vector<string> board(n, string(n, '.'));
        backTracking(0, n, board);
        return res;
    }
};

37.解数独

在这里插入图片描述
这道题是需要搜索一种满足条件的情况,无须遍历整个搜索树,所以回溯函数需要提供返回值类型(bool)
该题不需要递归终止条件,因为终止表现在返回值bool里,一旦找到满足条件的就返回true
且该题是一个二维搜索,而不是像之前的n皇后一样一次搜索一层,放一个皇后一样,该题需要直接使用2层for循环进行搜索,然后再使用一层for循环来遍历放的数字

class Solution {
public:
    bool check(int row, int col, char k, vector<vector<char>>& board) {
        // 1.检测同行
        for (int i = 0; i < board[row].size(); i++) {
            if (board[row][i] == k)
                return false;
        }
        // 2.检测同列
        for (int i = 0; i < board.size(); i++) {
            if (board[i][col] == k)
                return false;
        }
        // 寻找该位置属于的3*3宫的左上角的位置
        int startrow = (row / 3) * 3;
        int startcol = (col / 3) * 3;
        for (int i = startrow; i < startrow + 3; i++) {
            for (int j = startcol; j < startcol + 3; j++) {
                if (board[i][j] == k)
                    return false;
            }
        }
        return true;
    }
    bool backTracking(vector<vector<char>>& board) {
        for (int i = 0; i < board.size(); i++) {
            for (int j = 0; j < board[i].size(); j++) {
                // 如果是数字,则说明是给出的或者已经填好的,跳过即可
                if (board[i][j] != '.')
                    continue;
                for (char k = '1'; k <= '9'; k++) {
                    if (check(i, j, k, board)) {
                        board[i][j] = k;
                        if (backTracking(board))
                            return true;
                        board[i][j] = '.';
                    }
                }
                // 如果遍历了1-9,在该位置都无法获得一个true的答案的话,那么返回false,之后就会在上一层递归进行board的回退
                return false;
            }
        }
        return true;
    }
    void solveSudoku(vector<vector<char>>& board) { backTracking(board); }
};

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

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

相关文章

fastapi学习前置知识点

前置知识点 FastApi&#xff1a;一个用于构建API的现代、快速&#xff08;高性能&#xff09;的web框架。 FastApi是建立在Pydantic和Starlette基础上&#xff0c;Pydantic是一个基于Python类型提示来定义数据验证、序列化和文档的库。Starlette是一种轻量级的ASGI框架/工具包…

Matlab|【重磅】配电网故障重构/孤岛划分

目录 1 主要内容 1.1 背景 1.2 流程图 2 部分代码 3 程序结果 4 下载链接 1 主要内容 程序主要复现《基于GA_BFGS算法的配电网故障恢复性重构研究_郑海广》&#xff0c;采用matlab编程软件实现&#xff0c;依据网络结构和DG供电方式对配电网进行孤岛划分&#xff0c;将含…

避免使用for循环操作高维数组:numpy.apply_along_axis用法

文章目录 场景实际操作编写相关函数np.apply_along_axis 场景 设想我有一列高维向量&#xff0c;读取之后的数据都是字符串变量&#xff0c;我需要把这些字符串数据转换为复数之后求绝对值 实际操作 在使用pd.read_csv()读取数据之后&#xff0c;将这一列数据转换为numpy数…

Python高阶学习记录

文章导读 阅读本文需要一定的python基础&#xff0c;部分知识点是对python入门篇学习记录和python并发编程学习记录的深入探究&#xff0c;本文记录的Python知识点包括函数式编程&#xff0c;装饰器&#xff0c;生成器&#xff0c;迭代器&#xff0c;正则表达式&#xff0c;内存…

面试题------>JVM虚拟机!!!

一、Java对象内存布局 二、JVM 内存结构 程序计数器: 线程私有的(每个线程都有一个自己的程序计数器),是一个指针.代码运行,执行命令.而每个命令都是有行号的,会使用程序计数器来记录命令执行到多少行了.记录代码执行的位置. Java虚拟机栈: 线程私有的(每个线程都有一个自己…

【计算机网络】计算机网络的组成与功能

计算机网络的组成与功能 导读一、计算机网络的组成1.1 从组成方式上1.1.1 硬件1.1.2 软件1.1.3 协议 1.2 从工作方式上1.3 从功能组成上 二、计算机网络的功能2.1 数据通信2.2 资源共享2.3 分布式处理2.4 提高可靠性2.5 负载均衡2.6 其它 结语 导读 大家好&#xff0c;很高兴又…

可视化数据科学平台在信贷领域应用系列五:零代码可视化建模

信贷风控模型是金融机构风险管理的核心工具&#xff0c;在信贷风险管理工作中扮演着至关重要的角色。随着信贷市场的环境不断变化&#xff0c;信贷业务的风险日趋复杂化和隐蔽化&#xff0c;开发和应用准确高效的信贷风控模型显得尤为重要。信贷风险控制面临着越来越大的挑战和…

orbslam2代码解读(1):数据预处理过程

写orbslam2代码解读文章的初衷 首先最近陆陆续续花了一两周时间学习视觉slam&#xff0c;因为之前主要是做激光slam&#xff0c;有一定基础所以学的也比较快&#xff0c;也是看完了视觉14讲的后端后直接看orbslam2的课&#xff0c;看的cvlife的课&#xff08;课里大部分是代码…

规则引擎LiteFlow发布v2.12.1版本,决策路由特性

个人博客&#xff1a;无奈何杨&#xff08;wnhyang&#xff09; 个人语雀&#xff1a;wnhyang 共享语雀&#xff1a;在线知识共享 Github&#xff1a;wnhyang - Overview 简介 标题其实是不准确的&#xff0c;了解过的会知道在LiteFlow的2.12.0已经有了决策路由的特性&…

python数据文件处理库-pandas

内容目录 一、pandas介绍二、数据加载和写出三、数据清洗四、数据转换五、数据查询和筛选六、数据统计七、数据可视化 pandas 是一个 Python提供的快速、灵活的数据结构处理包&#xff0c;让“关系型”或“标记型”数据的交互既简单又直观。 官网地址: https://pandas.pydata.o…

树形表/树形数据接口的开发

数据表格式 需要返回的json格式 点击查看json数据 [{"childrenTreeNodes" : [{"childrenTreeNodes" : null,"id" : "1-1-1","isLeaf" : null,"isShow" : null,"label" : "HTML/CSS","na…

14.pinia初始与安装

pinia初始与安装 pinia官网 https://pinia.vuejs.org/ https://pinia.vuejs.org/introduction.html pinia安装 npm install pinia main.ts引入pinia import { createApp } from vue // import ./style.css import App from ./App.vue import router from ./router/index // …

LangChain :构建个人AI代理从这里开始

LangChain&#xff0c;一个强大的工具&#xff0c;允许根据用户输入创建对语言模型和其他工具的复杂调用链。就像拥有一个私人助理&#xff0c;可以根据手头的任务做出决定。本文来分享一下在 LangChain 中使用 Agents 的心路历程。 LangChain中代理的概念 在 LangChain 中&a…

网络高频攻击手段与基本防护措施总结

主要攻击手段 一、云平台攻击 云平台攻击是指针对云服务器的恶意行为&#xff0c;旨在获取非法访问权限、窃取敏感数据或者破坏服务器的正常运行。云平台攻击的形式多样&#xff0c;以下是对云平台攻击的一些主要类型和特点的详细分析&#xff1a; 攻击类型&#xff1a; 凭据…

苹果手机数据不见了怎么恢复?3个方法,搞定苹果手机数据恢复!

在许多错误的情况下&#xff0c;当你更新到最新的 iOS 版本或使用越狱来获得更多功能和权限、误删重要的手机文件时&#xff0c;苹果手机中的数据可能会丢失或被意外删除。一旦发现数据丢失&#xff0c;你就会查看 iTunes 备份或 iCloud 备份&#xff0c;并希望在其中恢复丢失的…

Rust 性能分析

都说Rust性能好,但是也得代码写得好,猜猜下面两个代码哪个快 . - 力扣&#xff08;LeetCode&#xff09; use std::collections::HashMap; use lazy_static::lazy_static;lazy_static! {static ref DIGIT: HashMap<char, usize> {let mut m HashMap::new();for c in …

electron打包时资源下载失败cannot resolve xxx/30.0.9/electron-v30.0.9-win32-ia32.zip

同学们可以私信我加入学习群&#xff01; 正文开始 问题描述解决方案总结 问题描述 最近electron更新频繁&#xff0c;而我在用electron做个人项目&#xff0c;对稳定性没有太高要求&#xff0c;希望保持着electron的最新版本&#xff0c;所以就没有固定版本。 单位网络不太好…

Jmeter性能分析及调优详解(入门)

一、系统性能理解 如果说需求、开发、DB、运维、测试是单一一门学科&#xff0c;那么性能就是综合学科&#xff0c;它包含了需求分析、DB、开发、测试、运维的所有学科。其实一般来说在实际性能分析和调优中&#xff0c;测试担任的角色就是写压测脚本并执行脚本查看结果&#…

区间预测 | Matlab实现QRCNN-GRU-Attention分位数回归卷积门控循环单元注意力机制时序区间预测

区间预测 | Matlab实现QRCNN-GRU-Attention分位数回归卷积门控循环单元注意力机制时序区间预测 目录 区间预测 | Matlab实现QRCNN-GRU-Attention分位数回归卷积门控循环单元注意力机制时序区间预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现QRCNN-GRU-…

在Linux上的Java项目导出PDF乱码问题

在Linux上的Java项目导出PDF乱码问题 场景&#xff1a;一个Java项目导出PDF&#xff0c;在我本地导出是没有问题&#xff0c;但是部署上Linux上后&#xff0c;导出就出现了乱码了。 处理方案 我这里使用的处理方案是在Linux服务器上安装一些PDF需要使用的字体 1.把字体上传到…