算法学习——LeetCode力扣回溯篇3

算法学习——LeetCode力扣回溯篇3

在这里插入图片描述

491. 非递减子序列

491. 非递减子序列 - 力扣(LeetCode)

描述

给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。

数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。

示例

示例 1:

输入:nums = [4,6,7,7]
输出:[[4,6],[4,6,7],[4,6,7,7],[4,7],[4,7,7],[6,7],[6,7,7],[7,7]]

示例 2:

输入:nums = [4,4,3,2,1]
输出:[[4,4]]

提示

  • 1 <= nums.length <= 15
  • -100 <= nums[i] <= 100

代码解析

在这里插入图片描述

class Solution {
public:vector<vector<int>> result;vector<int> path;void backtracking(vector<int>& nums , int indnx ){//小于2的不加入结果,至少两个if(path.size()>=2) result.push_back(path);if(indnx >= nums.size()) return;//用set统计每一层相同值元素的使用unordered_set<int> uset;for(int i =indnx ; i<nums.size(); i++){//如果当前值小于上一个,或者这个值在该层用过了,跳过if(path.empty() == 0 && nums[i] < path.back() || uset.find(nums[i]) != uset.end()) continue;//将该使用过的存入set,标记使用过uset.insert(nums[i]);path.push_back(nums[i]);backtracking(nums,i+1 );path.pop_back();}return;}vector<vector<int>> findSubsequences(vector<int>& nums) {backtracking(nums,0);return result;}
};

46. 全排列

46. 全排列 - 力扣(LeetCode)

描述

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

示例

示例 1:

输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

示例 2:

输入:nums = [0,1]
输出:[[0,1],[1,0]]

示例 3:

输入:nums = [1]
输出:[[1]]

提示

  • 1 <= nums.length <= 6
  • -10 <= nums[i] <= 10
  • nums 中的所有整数 互不相同

代码解析

回溯法
class Solution {
public:vector<vector<int>> result;vector<int> path;void backtracking(vector<int> &nums){if(path.size() == nums.size()){result.push_back(path);return;} for(int i = 0 ; i<nums.size() ; i++){auto it = find(path.begin(),path.end(),nums[i]);//如果这个元素在这个树枝之前用过,就跳出if(it == path.end()) {path.push_back(nums[i]);}else{continue;}backtracking(nums);path.pop_back();}return;}vector<vector<int>> permute(vector<int>& nums) {backtracking(nums);return result;}
};
回溯标记法

在这里插入图片描述

class Solution {
public:vector<vector<int>> result;vector<int> path;void backtracking (vector<int>& nums, vector<bool>& used) {// 此时说明找到了一组if (path.size() == nums.size()) {result.push_back(path);return;}for (int i = 0; i < nums.size(); i++) {if (used[i] == true) continue; // path里已经收录的元素,直接跳过used[i] = true;path.push_back(nums[i]);backtracking(nums, used);path.pop_back();used[i] = false;}}vector<vector<int>> permute(vector<int>& nums) {result.clear();path.clear();vector<bool> used(nums.size(), false);backtracking(nums, used);return result;}
};

47. 全排列 II

47. 全排列 II - 力扣(LeetCode)

描述

给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。

示例

示例 1:

输入:nums = [1,1,2]
输出:
[[1,1,2],
[1,2,1],
[2,1,1]]

示例 2:

输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

提示

  • 1 <= nums.length <= 8
  • -10 <= nums[i] <= 10

代码解析

回溯标记法(不去重,时间复杂度高)

在插入之前做一个find查找,找不到相同的插入

class Solution {
public:vector<vector<int>> result;vector<int> path;void backtracking(vector<int>& nums , vector<bool>& used){if(path.size() == nums.size()){if(find(result.begin() , result.end() , path) == result.end() ) result.push_back(path);return;}for(int i=0 ; i<nums.size() ;i++){if(used[i] == 1) continue;used[i]=1;path.push_back(nums[i]);backtracking(nums,used);path.pop_back();used[i]=0;}return;}vector<vector<int>> permuteUnique(vector<int>& nums) {vector<bool> used(nums.size(),false);backtracking(nums,used);return result;}
};
回溯去重
class Solution {
private:vector<vector<int>> result;vector<int> path;void backtracking (vector<int>& nums, vector<bool>& used) {// 此时说明找到了一组if (path.size() == nums.size()) {result.push_back(path);return;}for (int i = 0; i < nums.size(); i++) {// used[i - 1] == true,说明同一树枝nums[i - 1]使用过// used[i - 1] == false,说明同一树层nums[i - 1]使用过// 如果同一树层nums[i - 1]使用过则直接跳过if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false) //去重{continue;}if (used[i] == false) {used[i] = true;path.push_back(nums[i]);backtracking(nums, used);path.pop_back();used[i] = false;}}}
public:vector<vector<int>> permuteUnique(vector<int>& nums) {result.clear();path.clear();sort(nums.begin(), nums.end()); // 排序vector<bool> used(nums.size(), false);backtracking(nums, used);return result;}
};
树层去重
if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false)
{continue;
}

在这里插入图片描述

树枝去重
if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == true)
{continue;
}

在这里插入图片描述

332. 重新安排行程

332. 重新安排行程 - 力扣(LeetCode)

描述

给你一份航线列表 tickets ,其中 tickets[i] = [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。

所有这些机票都属于一个从 JFK(肯尼迪国际机场)出发的先生,所以该行程必须从 JFK 开始。如果存在多种有效的行程,请你按字典排序返回最小的行程组合。

例如,行程 [“JFK”, “LGA”] 与 [“JFK”, “LGB”] 相比就更小,排序更靠前。
假定所有机票至少存在一种合理的行程。且所有的机票 必须都用一次 且 只能用一次。

示例

示例 1:
在这里插入图片描述

输入:tickets = [[“MUC”,“LHR”],[“JFK”,“MUC”],[“SFO”,“SJC”],[“LHR”,“SFO”]]
输出:[“JFK”,“MUC”,“LHR”,“SFO”,“SJC”]

示例 2:

在这里插入图片描述

输入:tickets = [[“JFK”,“SFO”],[“JFK”,“ATL”],[“SFO”,“ATL”],[“ATL”,“JFK”],[“ATL”,“SFO”]]
输出:[“JFK”,“ATL”,“JFK”,“SFO”,“ATL”,“SFO”]
解释:另一种有效的行程是 [“JFK”,“SFO”,“ATL”,“JFK”,“ATL”,“SFO”] ,但是它字典排序更大更靠后。

提示

  • 1 <= tickets.length <= 300
  • tickets[i].length == 2
  • fromi.length == 3
  • toi.length == 3
  • fromi 和 toi 由大写英文字母组成
  • fromi != toi

代码解析

回溯遍历(超时)

回溯遍历每一种可能
当出现第一种可能的路线,之间加入。
当出现新的可能路线,与老路线对比,如果字典排序小于,则替换老路线

class Solution {
public:vector<string> resul;vector<string> path;void backtraking(vector<vector<string>>& tickets , string Indnx ,  vector<bool> &used){//找到路线,看是否替换老的路径//如果没有老路径直接加入,如果相同就返回,如果不同路径按照字典比较if(path.size()==tickets.size()+1){if(resul.empty()==1) {resul = path;return;}else if(resul == path) return;else {for(int j=0 ;j<path.size();j++){for(int k=0 ;k<3;k++){if(resul[j][k] == path[j][k]) continue;else if(resul[j][k] < path[j][k])return;else if(resul[j][k] > path[j][k]) {resul.clear();resul = path;return;}}}}// cout<<"resu: ";// for(auto i:resul) cout<<i<<' ';// cout<<endl;return;}for(int i=0 ; i<tickets.size();i++){//如果当前机票使用过,或者当前机票目的地不对,跳过if(used[i]==true || tickets[i][0] != Indnx) continue;//如果当前机票可用,则加入路径if(used[i]== false && tickets[i][0] == Indnx){used[i] = true;path.push_back(tickets[i][1]);//递归,确定递归找的新机票。下一站机票的开始机场,就是当前机票的目的地机场backtraking(tickets,tickets[i][1],used);used[i] = false;path.pop_back();}}return;}vector<string> findItinerary(vector<vector<string>>& tickets) {vector<bool> used(tickets.size(),false);path.push_back("JFK");backtraking(tickets,"JFK",used);return resul;}
};
排序再回溯

先对输入票排序,其中排序按照票的目的地的字典减少排序(因为出发点是确定的,目的地多种找最优解)
之后回溯遍历找路线,发现的第一个路线即为最优路线

class Solution {
public://按飞机票目的地(字符串vector第二个参数)字典减小排序class compare{public:bool operator()( const vector<string> tickets1 ,const  vector<string> tickets2 ){if((tickets1[1])[0]  < (tickets2[1])[0]) return 1;else if((tickets1[1])[0]  == (tickets2[1])[0]){if((tickets1[1])[1]  < (tickets2[1])[1]) return 1;else if((tickets1[1])[1]  == (tickets2[1])[1]){if((tickets1[1])[2]  < (tickets2[1])[2]) return 1;else return 0;}return 0;}return 0;}};vector<string> resul;vector<string> path;bool find = false;void backtraking(vector<vector<string>>& tickets , string Indnx ,  vector<bool> &used){//找到一个路径就不找了,直接是最优路径if(find == true ) return;if(path.size()==tickets.size()+1){resul = path;find =true;return;}for(int i=0 ; i<tickets.size();i++){if(used[i]==true || tickets[i][0] != Indnx) continue;if(used[i]== false && tickets[i][0] == Indnx){used[i] = true;path.push_back(tickets[i][1]);backtraking(tickets,tickets[i][1],used);used[i] = false;path.pop_back();}}return;}vector<string> findItinerary(vector<vector<string>>& tickets) {vector<bool> used(tickets.size(),false);sort(tickets.begin(),tickets.end(),compare());// for(auto i:tickets) // {//      cout<<'[';//     for(auto j:i)//     {//          cout<<j<<' ';//     }//      cout<<']';// }path.push_back("JFK");backtraking(tickets,"JFK",used);return resul;}
};

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

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

相关文章

android 控制台输出 缺失

问题 android 控制台输出内容缺失 详细问题 笔者进行android开发&#xff0c;期望控制台打印Log日志或是输出内容 Log.i("tag","content");或 System.out.println("content")但是实际上&#xff0c;上述内容并没有按照笔者期望打印 解决方…

PhP+vue企业原材料采购系统_cxg0o

伴随着我国社会的发展&#xff0c;人民生活质量日益提高。互联网逐步进入千家万户&#xff0c;改变传统的管理方式&#xff0c;原材料采购系统以互联网为基础&#xff0c;利用php技术&#xff0c;结合vue框架和MySQL数据库开发设计一套原材料采购系统&#xff0c;提高工作效率的…

Stable Diffusion 模型下载:ToonYou(平涂卡通)

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十

linux系统下vscode portable版本的python环境搭建003:venv

这里写自定义目录标题 python安装方案一. 使用源码安装&#xff08;有[构建工具](https://blog.csdn.net/ResumeProject/article/details/136095629)的情况下&#xff09;方案二.使用系统包管理器 虚拟环境安装TESTCG 本文目的&#xff1a;希望在获得一个新的系统之后&#xff…

电脑监控屏幕软件有哪些(监控电脑屏幕的软件)

随着信息技术的迅猛发展&#xff0c;电脑屏幕监控软件已成为企业、家庭以及教育机构保护数据安全、提升工作效率以及进行行为分析的重要工具。本文将详细介绍几款主流的电脑屏幕监控软件&#xff0c;包括它们的功能、特点以及适用场景&#xff0c;帮助读者更好地了解并选择合适…

对进程与线程的理解

目录 1、进程/任务&#xff08;Process/Task&#xff09; 2、进程控制块抽象(PCB Process Control Block) 2.1、PCB重要属性 2.2、PCB中支持进程调度的一些属性 3、 内存分配 —— 内存管理&#xff08;Memory Manage&#xff09; 4、线程&#xff08;Thread&#xff09;…

第二十八回 施恩重霸孟州道 武松醉打蒋门神-可用于生产环境的Python Web框架:Pyramid

施恩给武松讲了他的烦心事&#xff0c;他在快活林的酒肉店被蒋门神霸占了。希望武松能帮他出气。施恩的父亲也从屏风后走出来&#xff0c;让施恩拜武松为兄长。 武松要去打蒋门神&#xff0c;跟施恩约好了“无三不过望”&#xff0c;望子就是酒旗&#xff0c;意思看到酒旗就要…

书城项目历程记录2|最后阶段记录

2024年1月31日 p270-276 1.免用户名登录和注销&#xff08;知识点cookie和session&#xff09; 在学习了cookie和session之后&#xff0c;实现了免用户名登录和注销操作。 免用户名就是在本次session登录成功之后&#xff0c;对session进行setAttribute操作&#xff0c;jsp文…

linux系统下vscode portable版本的c++/Cmake环境搭建001

linux系统下vscode portable版本的Cmake环境搭建 vscode portable 安装安装基本工具安装 build-essential安装 CMake final script code安装插件CMake Tools & cmakeC/C Extension Pack Testsettings,jsonCMakeLists.txt调试和运行工具 CG 目的&#xff1a;希望在获得一个新…

Linux第51步_移植ST公司的linux内核第3步_添加修改设备树

1、设备树文件的路径 1)、创建linux中的设备树头文件 在“my_linux/linux-5.4.31/arch/arm/boot/dts/”目录中&#xff0c;以“stm32mp15xx-edx.dtsi”为蓝本&#xff0c;复制一份&#xff0c;并命名为 “stm32mp157d-atk.dtsi”&#xff0c;这就是我们开发板的设备树头文件。…

CSS3 基本语法

CSS3 基本语法 1. CSS3 新增长度单位 rem 根元素字体大小的倍数&#xff0c;只与根元素字体大小有关。vw 视口宽度的百分之多少 10vw 就是视口宽度的 10% 。vh 视口高度的百分之多少 10vh 就是视口高度的 10% 。vmax 视口宽高中大的那个的百分之多少。&#xff08;了解即可&am…

HeidiSQL安装配置(基于小皮面板(phpstudy))连接MySQL

下载资源 对于这款图形化工具&#xff0c;博主建议通过小皮面板&#xff08;phpstudy&#xff09;来下载即可&#xff0c;也是防止你下载到钓鱼软件&#xff0c;小皮面板&#xff08;phpstudy&#xff09;如果你不懂是什么&#xff0c;请看下面链接这篇博客 第二篇&#xff1a;…

装饰工程|装饰工程管理系统-项目立项子系统的设计与实现|基于Springboot的装饰工程管理系统设计与实现(源码+数据库+文档)

装饰工程管理系统-项目立项子系统目录 目录 基于Springboot的装饰工程管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、管理员功能实现 &#xff08;2&#xff09;合同报价管理 &#xff08;3&#xff09;装饰材料总计划管理 &#xff08;4&#xff0…

bert-vits2本地部署报错疑难问题汇总

环境&#xff1a; bert-vits2.3 win 和wsl 问题描述&#xff1a; bert-vits2本地部署报错疑难问题汇总 解决方案&#xff1a; 问题1: Conda安装requirements里面依赖出现ERROR: No matching distribution found for opencc1.1.6 解决方法 需要在 Python 3.11 上使用 Op…

Dynamo设置明细表字段格式——保留小数位数

Hello大家好&#xff01;我是九哥~ 今天简单分享一个API的用法&#xff0c;就是设置明细表的中字段的字段格式。 本次呢&#xff0c;主要介绍下如何通过Dynamo设置长度、面积等几种字段的格式&#xff0c;设置小数位数的显示&#xff0c;如下图&#xff1a; 当然了&#xf…

OpenMVG(特征匹配、照片组重建点云、GPS位置信息、GMS)

目录 1 图像的特征匹配 2 图像中提取GPS位置信息 2.1 写入GPS信息到图像中 2.2 读取带有GPS的图像 3 SIFT/AKAZE/AKAZE_MLDB特征提取对比 4 GMS Filter 5 将球形全景图转换为6个透视视图 6 照片组重建点云 1 图像的特征匹配 #include "openMVG/features/feature.…

ELAdmin 部署

后端部署 按需修改 application-prod.yml 例如验证码方式、登录状态到期时间等等。 修改完成后打好 Jar 包 执行完成后会生成最终可执行的 jar。JPA版本是 2.6&#xff0c;MyBatis 版本是 1.1。 启动命令 nohup java -jar eladmin-system-2.6.jar --spring.profiles.active…

vmware workstation群晖虚拟机vmdk文件导出

为了防止群晖虚拟机中整个挂掉&#xff0c;里面的文件导不出来&#xff0c;尝试直接从vmdk中获取内容。 1、想采用diskgenius去读取文件&#xff0c;发现volume1是空的。只能读取群晖的系统文件。 2、选择另一个linux系统的虚拟机&#xff0c;选择对应的vmdk 3、如果有文件管理…

二叉树的层序遍历II

1.题目 这道题是2024-2-15的签到题&#xff0c;题目难度为中等。 考察的知识点为BFS算法&#xff08;树的层序遍历&#xff09; 题目链接&#xff1a;二叉树的层序遍历II 给你二叉树的根节点 root &#xff0c;返回其节点值 自底向上的层序遍历 。 &#xff08;即按从叶子节…

【Qt 学习之路】在 Qt 使用 ZeroMQ

文章目录 1、概述2、ZeroMQ介绍2.1、ZeroMQ 是什么2.2、ZeroMQ 主线程与I/O线程2.3、ZeroMQ 4种模型2.4、ZeroMQ 相关地址 3、Qt 使用 ZeroMQ3.1、下载 ZeroMQ3.2、添加 ZeroMQ 库3.3、使用 ZeroMQ3.4、相关 ZeroMQ 案例 1、概述 今天是大年初一&#xff0c;先给大家拜个年&am…