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

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*3int 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.hqwc.cn/news/81812.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习理论笔记(二):数据集划分以及模型选择

文章目录 1 前言2 经验误差与过拟合3 训练集与测试集的划分方法3.1 留出法&#xff08;Hold-out&#xff09;3.2 交叉验证法&#xff08;Cross Validation&#xff09;3.3 自助法&#xff08;Bootstrap&#xff09; 4 调参与最终模型5 结语 1 前言 欢迎来到蓝色是天的机器学习…

MetaMask Mobile +Chrome DevTools 调试Web3应用教程

注&#xff1a;本教程来源网络&#xff0c;有兴趣的可以直接到这里查看。 写好了WEB3应用&#xff0c;在本地调试用得好好的&#xff0c;但是用钱包软件访问就报莫名的错&#xff0c;但是又不知道是什么原因&#xff0c;排查的过程非常浪费时间 。 因此在本地同一局域网进行调试…

STM32--USART串口

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

redux中间件理解,常见的中间件,实现原理。

文章目录 一、Redux中间件介绍1、什么是Redux中间件2、使用redux中间件 一、Redux中间件介绍 1、什么是Redux中间件 redux 提供了类似后端 Express 的中间件概念&#xff0c;本质的目的是提供第三方插件的模式&#xff0c;自定义拦截 action -> reducer 的过程。变为 actio…

【面试题系列】(一)

Redis有哪些数据结构&#xff1f;其底层是怎么实现的&#xff1f; Redis 系列&#xff08;一&#xff09;&#xff1a;深入了解 Redis 数据类型和底层数据结构 字符串&#xff08;String&#xff09;&#xff1a; 用于存储文本或二进制数据。可以执行字符串的基本操作&#xf…

人工智能开发板 SE5 - MB1684开发入门指南 -- 模型转换、交叉编译、开发板运行 yolov5 目标追踪

介绍 我们属于SoC模式&#xff0c;即我们在x86主机上基于tpu-nntc和libsophon完成模型的编译量化与程序的交叉编译&#xff0c;部署时将编译好的程序拷贝至SoC平台&#xff08;1684开发板/SE微服务器/SM模组&#xff09;中执行。 注&#xff1a;以下都是在Ubuntu20.04系统上操…

如何提供一个可信的AB测试解决方案

本文以履约场景下的具体实践为背景&#xff0c;介绍如何提供一个可信赖的AB测试解决方案。一方面从实验方法的角度论述实验过程中容易被忽视的统计陷阱&#xff0c;给出具体的解决方案&#xff0c;一方面从平台建设角度论述针对业务场景和对应约束制定实验方案提供给用户&#…

docker安装clickhouse

安装 docker安装 创建clickhouse目录 mkdir -P /data/clickhouse/datamkdir -P /data/clickhouse/confmkdir -P /data/clickhouse/log 拉取镜像 这里直接拉取最新镜像, 如果需要某个特定版本, 则再拉取的时候指定版本号即可. docker pull clickhouse/clickhouse-server 启动临…

【安全】原型链污染 - Hackit2018

目录 准备工作 解题 代码审计 Payload 准备工作 将这道题所需依赖模块都安装好后 运行一下&#xff0c;然后可以试着访问一下&#xff0c;报错是因为里面没内容而已&#xff0c;不影响,准备工作就做好了 解题 代码审计 const express require(express) var hbs require…

QT6串口模块QSerialport的安装,主要是“编译器”版本问题

参考文档 https://blog.csdn.net/lidandan2016/article/details/85929069 https://blog.csdn.net/qq_42968012/article/details/126020554 https://blog.csdn.net/weixin_48467622/article/details/119982667 整体测试解决步骤总结 首先&#xff0c;QT6都不能进行离线安装&a…

SpringBoot概述SpringBoot基础配置yml的使用多环境启动

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaEE 操作系统 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 SpringBoot简介 一、 SpringBoot概述1.1 起步依赖…

总结:Git 撤销操作

1、还未添加到暂存区&#xff1a;git checkout -- filename 执行命令后&#xff0c;会回退到未修改之前的状态 2、已经添加到暂存区&#xff1a;git reset HEAD filename 执行命令后&#xff0c;会回退到工作区之前的状态 3、已经 commit&#xff0c;但是还未 push git reset…