day-30 代码随想录算法训练营 回溯part06

news2024/11/24 13:37:07

332.重新安排行程

思路:使用unordered_map记录起点机场对应到达机场,内部使用map记录到达机场的次数(因为map会进行排序,可以求出最小路径)
class Solution {
public:
    vector<string>res;
    unordered_map<string,map<string,int>>targets;//使用map主要是map会自动根据键值自动排序
    bool backtrace(vector<vector<string>>&tickets){
        if(res.size()==tickets.size()+1)
            return true;
        for(pair<const string,int>&target:targets[res[res.size()-1]]){
            if(target.second>0){
                res.push_back(target.first);
                target.second--;
                if(backtrace(tickets)==true) return true;
                target.second++;
                res.pop_back();
            }
        }
        return false;
    }
    vector<string> findItinerary(vector<vector<string>>& tickets) {
        res.push_back("JFK");//插入起点
        //记录每个机场出发到达情况
        for(auto it:tickets)
            targets[it[0]][it[1]]++;//根据起点机场,找到到达机场,并记录到达机场的次数
        backtrace(tickets);
        return res;

    }
};

51.N皇后

思路:递归遍历棋盘的每一行,然后在每一行中寻找有效位置,找到时才进行下一次递归遍历
有效位置的判断:
  • 判断左斜线上方
  • 判断右斜线上方
  • 判断上方同一列
class Solution {
public:
    vector<vector<string>>res;
    bool judge(int row,int colum,vector<string>&mids,int n){
        //判断行(行上无需判断,因为每一个都是一种回溯
        //判断列
        for(int i=0;i<row;i++){
            if(mids[i][colum]=='Q')
                return false;
        }

        //判断左上方
        for(int i=row-1,j=colum-1;i>=0 && j>=0;i--,j--){
            if(mids[i][j]=='Q')
                return false;
        }

        //判断右上方
        for(int i=row-1,j=colum+1;i>=0 && j<n;i--,j++){
            if(mids[i][j]=='Q')
                return false;
        }
        return true;
    }
    void backtrace(vector<string>&mids,int start,int n){
        if(start==n){//整个棋盘每一行都遍历摆完
            res.push_back(mids);
            return;
        }
        for(int i=0;i<n;i++){
            if(judge(start,i,mids,n)){//判断该位置是否有效
                mids[start][i]='Q';
                backtrace(mids,start+1,n);
                mids[start][i]='.';
            }
        }
    }
    vector<vector<string>> solveNQueens(int n) {
        vector<string>mids(n,string(n,'.'));
        backtrace(mids,0,n);
        return res;
    }
};

37.解数独

思路:遍历整个数独棋盘
然后从1-9依次判断是否能放入当前位置,当能放入时,放置当前值,然后递归开启下一次遍历,同时判断下一次遍历是否true,
  • 在填入该值后,数独能填完的情况下,最后都会返回true
  • 在填入该值后,后序数独无法填完,就返回false

在遍历完1-9还无法有效放入,则直接返回false

class Solution {
public:
    bool isvaild(int row,int colum,char val,vector<vector<char>>&board){
        //判断这一行
        for(int i=0;i<9;i++){
            if(board[row][i]==val) return false;
        }
        //判断这一列
        for(int j=0;j<9;j++){
            if(board[j][colum]==val) return false;
        }
        //判断九宫格
        int midRow=(row/3)*3;//比如0、1、2都被限制为0*3,后面3,4,5限制为1*3
        int midColum=(colum/3)*3;
        for(int i=midRow;i<midRow+3;i++){
            for(int j=midColum;j<midColum+3;j++){
                if(board[i][j]==val)
                    return false;
            }
        }
        return true;
    }
    bool backtrace(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]=='.'){
                    for(char k='1';k<='9';k++){
                        if(isvaild(i,j,k,board)){
                            board[i][j]=k;
                            if(backtrace(board))//该位置k有效时,进入递归判断
                                return true;
                            board[i][j]='.';//无效时,直接回溯
                        }       
                    }
                    return false;//所有数字都无效情况下,直接返回false
                }
            }
        }
        return true;
    }
    void solveSudoku(vector<vector<char>>& board) {
        backtrace(board);
    }
};

53.最大子数组和

思路:遍历数组,计算连续和,当连续和持续增大时更新最大连续和;当连续和为负值时,重置连续和为0,下一次重新计算连续和
class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int n=nums.size();
        int count=0,result=INT_MIN;
        for(int i=0;i<n;i++){
            count+=nums[i];
            if(count>result)//更新最大和
                result=count;
            if(count<=0) count=0;//因为要求连续子数组,出现和为负的情况直接更新和为0,
                                 //从下一位开始计算
        }
        return result;
    }
};

122.买卖股票的最佳时机||

思路:不需要考虑哪一天买入卖出,只需要找出每相邻两个数的递增值,在大于0的情况下累加,这样就都能收获利润
class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n=prices.size();
        int res=0;
        for(int i=1;i<n;i++){
            if(prices[i]>prices[i-1])//当可以产生利润时
                res+=(prices[i]-prices[i-1]);//累加利润
        }
        return res;
    }
};

55.跳跃游戏

 

思路一:从第一个位置开始更新最大覆盖值,然后在最大覆盖值的范围中寻找是否有到达目标位置的情况
class Solution {
public:
    bool canJump(vector<int>& nums) {
        int cover=0;
        if(nums.size()==1) return true;
        for(int i=0;i<=cover;i++){//在最大覆盖值中寻找
            cover=max(i+nums[i],cover);//更新最大覆盖值
            if(cover>=nums.size()-1) return true;//出现覆盖值可以到达终点
        }
        return false;
    }
};

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

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

相关文章

高等数学之曲率

a代表改变角度 s代表弧长 圆的曲率

JAVA-编程基础-10-集合

Lison <dreamlison163.com>, v1.0.0, 2023.04.23 JAVA-编程基础-10-集合 文章目录 JAVA-编程基础-10-集合List、Set、Map、队列全面解析ListArrayList创建ArrayList 向ArrayList中添加元素 List、Set、Map、队列全面解析 Java 集合框架可以分为两条大的支线&#xff1a;…

OpenSIPS 注册终端 30s 自动挂断问题

文章目录 1. 背景2. 问题分析3. 案例解决 1. 背景 在开发呼叫中心应用时&#xff0c;使用 OpenSIPS 作为 SIP 注册服务器&#xff0c;测试发现偶现电话接通后 30s 左右自动挂断的问题。一个正常的 SIP 注册及呼叫流程如下所示&#xff0c;可以看到 OpenSIPS 作为转发层只负责代…

Spark Standalone环境搭建及测试

&#x1f947;&#x1f947;【大数据学习记录篇】-持续更新中~&#x1f947;&#x1f947; 篇一&#xff1a;Linux系统下配置java环境 篇二&#xff1a;hadoop伪分布式搭建&#xff08;超详细&#xff09; 篇三&#xff1a;hadoop完全分布式集群搭建&#xff08;超详细&#xf…

Unity 之 GameObject.Find()在场景中查找指定名称的游戏对象

文章目录 GameObject.Find 是 Unity 中的一个函数&#xff0c;用于在场景中查找指定名称的游戏对象。这个函数的主要作用是根据游戏对象的名称来查找并返回一个引用&#xff0c;使您能够在代码中操作该对象。以下是有关 GameObject.Find 的详细介绍&#xff1a; 函数签名&…

rust actix-web定义中间件(middleware)记录接口耗时(接口耗时中间件和鉴权中间件)

文章目录 Actix-web定义中间件(middleware)记录接口耗时中间件简介中间件添加的两种方式&#xff08;接口耗时中间件&#xff09;使用wrap_fn 闭包实现使用warp struct实现中间件调用顺序actix自带的接口耗时中间件 鉴权中间件 Actix-web定义中间件(middleware)记录接口耗时 …

一文全懂!带你了解芯片“流片”!

一、流片是什么&#xff1f; 流片(tape-out)是指通过一系列工艺步骤在流水线上制造芯片&#xff0c;是集成电路设计的最后环节&#xff0c;也就是送交制造。 流片即为"试生产"&#xff0c;简单来说就是设计完电路以后&#xff0c;先生产几片几十片&#xff0c;供测试…

Packet_Tracer的使用

一、实验目的&#xff1a; 通过该实验了解Packet Tracer的使用方法&#xff0c;能够用Packet Tracer建立和模拟网络模型。 二、主要任务&#xff1a; 1.熟悉PT的界面&#xff0c;了解按键用途。 2.尝试自己建立一个小型网络&#xff0c;并测试连通性。 3.学习P…

STM32--USART串口

文章目录 通信接口串口通信硬件电路电平标准参数时序 USART主要特性框图 数据帧发送器 波特率发生器SWART串口发送与接收工程串口收发数据包 通信接口 通信接口是指连接中央处理器&#xff08;CPU&#xff09;和标准通信子系统之间的接口&#xff0c;用于实现数据和控制信息在不…

【JVM 内存结构 | 程序计数器】

内存结构 前言简介程序计数器定义作用特点示例应用场景 主页传送门&#xff1a;&#x1f4c0; 传送 前言 Java 虚拟机的内存空间由 堆、栈、方法区、程序计数器和本地方法栈五部分组成。 简介 JVM&#xff08;Java Virtual Machine&#xff09;内存结构包括以下几个部分&#…

关于CC2652的看门狗和系统时钟的我呢

看门狗 可以在CCS的syscfg的ui中配置&#xff0c;如下图 如果想看相关例程&#xff0c;可以电极最顶部watchdog旁边的问号 相关问题&#xff1a; 例程中没有添加hw_wdt的头文件&#xff0c;需要#include <ti/devices/cc13x2_cc26x2/inc/hw_wdt.h>&#xff0c;否则在获…

全面介绍ERP采购审批管理

在现代企业中&#xff0c;采购管理对于保障企业正常运营和维护供应链的稳定性至关重要。然而&#xff0c;传统的手动采购审批流程常常存在效率低下、易出错和缺乏可追溯性等问题。为了解决这些问题&#xff0c;越来越多的企业选择采用ERP采购审批管理方法&#xff0c;以实现更高…

CentOS7 TAR安装 EMQX(MQTT)

1、软件下载 官网 --> 右上角[免费试用] --> EMQX 下载 --> EMQX 开源版 --> 选择版本 系统 --> [免费下载] 选择 tar.gz amd64 --> [立即下载] 选择对应下载方式 上传到 /usr/local/ 目录下。 2、安装 #进入操作目录 cd /usr/local#创建安装目录 mk…

javascript常用的东西

JavaScript 是一门强大的编程语言&#xff0c;用于为网页添加交互性和动态性。也可以锻炼人们的逻辑思维&#xff0c;是一个非常好的东西。 一、变量和数据类型&#xff1a; 变量&#xff1a; 变量是用于存储数据值的容器。在 JavaScript 中&#xff0c;你可以使用 var、let…

ELK之LogStash介绍及安装配置

一、logstash简介 集中、转换和存储数据 Logstash 是免费且开放的服务器端数据处理管道&#xff0c;能够从多个来源采集数据&#xff0c;转换数据&#xff0c;然后将数据发送到您最喜欢的“存储库”中。 Logstash 能够动态地采集、转换和传输数据&#xff0c;不受格式或复杂度的…

2023.8 - java - Java 方法

什么是方法呢&#xff1f; Java方法是语句的集合&#xff0c;它们在一起执行一个功能。 方法是解决一类问题的步骤的有序组合方法包含于类或对象中方法在程序中被创建&#xff0c;在其他地方被引用 方法的命名规则 1.方法的名字的第一个单词应以小写字母作为开头&#xff0…

铁威马教程丨铁威马NAS如何使用安全顾问工具

在使用NAS的过程中&#xff0c;我们时常可能忽略了一些小细节&#xff0c;久而久之可能造成一定的风险&#xff0c;影响着我们NAS的健康。而使用铁威马NAS的安全顾问工具&#xff0c;可以快速地帮我们扫描系统设置是否安全&#xff0c;让我们更放心更安心地使用NAS。 安全顾问…

【Antd】Cascader 级联组件添加顶部栏(解决低版 antd 无 dropdownRender 属性方案)

文章目录 背景实现 背景 表单级联菜单需要添加表头&#xff0c;用于表示各级含义。 如果你的antd版本大于等于4.4.0&#xff0c;则直接可以使用dropdownRender 属性自定义&#xff0c;本篇文章可以直接跳过。 参数说明类型默认值版本dropdownRender自定义下拉框内容(menus: R…

LabVIEW利用线性压缩弹簧开发重量测量系统

LabVIEW利用线性压缩弹簧开发重量测量系统 柔性传感器的曲率半径相对于指定重量的变化特性可用作力测量方法。在许多应用中&#xff0c;例如&#xff1a;汽车和工业控制&#xff0c;计算机外围设备&#xff0c;操纵杆和测量设备&#xff0c;带有压缩弹簧和柔性传感器的重量测量…

【第三阶段】kotlin语言的takeUnless内置函数

1.takeUnless和takeif功能是相反的 username.takeif{true/false} true:返回username本身 false:返回null username.takeUnless{true/false} false:返回username本身 true:返回nullpackage Stage3 class Manager{private var info:String?nullfun getInfo()infofun setI…