day-27 代码随想录算法训练营(19)回溯part03
39.组合总和
分析:同一个数可以选多次,但是不能有重复的答案;
思路:横向遍历,纵向递归(不同的是递归的时候不需要跳到下一个位置,因为同一个数可以选多次)
class Solution {
public:vector<vector<int>>res;vector<int>mids;void backtrace(vector<int>&candidates,int start,int sum,int target){if(sum>=target){//终止条件if(sum==target)//目标条件res.push_back(mids);return;}for(int i=start;i<candidates.size();i++){mids.push_back(candidates[i]);sum+=candidates[i];backtrace(candidates,i,sum,target);//因为同一个数可以选多次,所以递归为imids.pop_back();sum-=candidates[i];}}vector<vector<int>> combinationSum(vector<int>& candidates, int target) {backtrace(candidates,0,0,target);return res;}
};
40.组合总和||
思路:重点在于去重
去重:树层去重,需要在递归遍历的时候判断是否重复
class Solution {
public:vector<vector<int>>res;vector<int>mids;void backtrace(vector<int>&candidates,int startIndex,int sum,int target,vector<bool>&used){if(sum==target){res.push_back(mids);return;}//剪枝for(int i=startIndex;i<candidates.size() && sum+candidates[i]<=target;i++){if(i>0 && candidates[i]==candidates[i-1] && used[i-1]==false)//树层去重continue;mids.push_back(candidates[i]);sum+=candidates[i];used[i]=true;backtrace(candidates,i+1,sum,target,used);used[i]=false;mids.pop_back();sum-=candidates[i];}}vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {sort(candidates.begin(),candidates.end());vector<bool>used(candidates.size(),false);backtrace(candidates,0,0,target,used);return res;}
};
131.分割回文串
思路:分割字符串,然后多了一个判断是否回文的操作
class Solution {
public:vector<vector<string>>res;vector<string>mids;bool judge(const string& s,int left,int right){while(left<right){if(s[left]!=s[right]) return false;left++;right--;}return true;}void backtrace(string&s,int startIndex){if(startIndex>=s.size()){res.push_back(mids);return;}for(int i=startIndex;i<s.size();i++){if(!judge(s,startIndex,i)) continue;//判断是否回文串string str=s.substr(startIndex,i-startIndex+1);mids.push_back(str);backtrace(s,i+1);mids.pop_back();}}vector<vector<string>> partition(string s) {backtrace(s,0);return res;}
};
78.子集
画图分析:
思路:横向遍历,每次遍历的时候都进行一次添加,然后进行纵向递归,递归完之后进行回溯。
- 注意:空集也是子集。(所有节点都需要添加)
class Solution {
public:vector<vector<int>>res;vector<int>mid;void backtrace(vector<int>&nums,int start){res.push_back(mid);if(start==nums.size()){//res.push_back(mid);return;}for(int i=start;i<nums.size();i++){mid.push_back(nums[i]);backtrace(nums,i+1);mid.pop_back();}}vector<vector<int>> subsets(vector<int>& nums) {backtrace(nums,0);return res;}
};
90.子集||
分析:和上题一样,区别在于有重复数字
思路:组合问题有重复都考虑先排序再操作!
class Solution {
public:vector<vector<int>>res;vector<int>mid;void backtrace(vector<int>&nums,int start){if(find(res.begin(),res.end(),mid)==res.end())//去重res.push_back(mid);if(start==nums.size())return;for(int i=start;i<nums.size();i++){mid.push_back(nums[i]);backtrace(nums,i+1);mid.pop_back();}}vector<vector<int>> subsetsWithDup(vector<int>& nums) {sort(nums.begin(),nums.end());//需要排序backtrace(nums,0);return res;}
};
491.递增子序列
思路:重点在于set去重以及递增条件
class Solution {
public:vector<vector<int>>midRes,res;vector<int>mid;void backtrace(vector<int>&nums,int start){if(mid.size()>=2 ){//条件限制midRes.push_back(mid);}if(start==nums.size())//终止条件return;unordered_set<int> vistedSet;for(int i=start;i<nums.size();i++){if(vistedSet.find(nums[i])!=vistedSet.end())//去重continue;if(!mid.empty() && mid.back()>nums[i])//递增条件continue;//judge[nums[i]]=true;vistedSet.insert(nums[i]);//遍历标记mid.push_back(nums[i]);backtrace(nums,i+1);mid.pop_back();//回溯}}vector<vector<int>> findSubsequences(vector<int>& nums) {backtrace(nums,0);return midRes;}
};
46.全排列
思路:跟子集的代码几乎一样,主要区别在于
-
每次遍历都从0开始,并且做树枝去重
class Solution {
public:vector<vector<int>>res;vector<int>mid;void backtrace(vector<int>&nums,int start){if(start==nums.size()){res.push_back(mid);}for(int i=0;i<nums.size();i++){if(find(mid.begin(),mid.end(),nums[i])!=mid.end())//树枝去重continue;mid.push_back(nums[i]);backtrace(nums,start+1);mid.pop_back();}}//树枝去重vector<vector<int>> permute(vector<int>& nums) {backtrace(nums,0);return res;}
};
47.全排列||
思路一:使用哈希表进行树枝下标去重(因为有重复元素)
问题:在数组去重时时间复杂度过高
class Solution {
public:vector<vector<int>>res;vector<int>mid;unordered_map<int,bool>map;void backtrace(vector<int>&nums,int start){if(start==nums.size()){if(find(res.begin(),res.end(),mid)==res.end())//数组去重res.push_back(mid);return;}for(int i=0;i<nums.size();i++){if(map[i])//树枝去重continue;mid.push_back(nums[i]);map[i]=true;backtrace(nums,start+1);mid.pop_back();map[i]=false;}}vector<vector<int>> permuteUnique(vector<int>& nums) {//sort(nums.begin(),nums.end());backtrace(nums,0);return res;}
};
323.重新安排行程
思路:首先记录航班的映射关系,然后从起点开始根据映射关系一一添加(横向遍历,纵向递归)
注意:
-
起点航班要先添加
-
如果添加的路线等于航班数+1时,说明已经走完全部航班(如五个航班,必然是六个站点)
-
递归深入的时候需要判断当前映射关系是否被添加过
class Solution {
public:unordered_map<string,map<string,int>>targets;vector<string>midres;bool backtrace(vector<vector<string>>& tickets){if(midres.size()==tickets.size()+1)//航班已经走完的终止条件return true;for(pair<const string,int>&target:targets[midres[midres.size()-1]]){//遍历映射关系if(target.second>0){//当映射关系还存在时midres.push_back(target.first);target.second--;if(backtrace(tickets)) return true;//已经找到一条路线midres.pop_back();target.second++;}}return false;}vector<string> findItinerary(vector<vector<string>>& tickets) {midres.push_back("JFK");//先添加起点航班for(auto it:tickets)targets[it[0]][it[1]]++;//记录映射关系backtrace(tickets);return midres;}
};
51.N皇后
思路:二维数组,行递归,列遍历
在列放置皇后的时候,要进行有效判断
- 1.判断列方向上有没有放置过(行方向是递归遍历进行的,所以只可能放置一个)
- 2.判断左上方有没有放置过
- 3.判断右上方有没有放置过(左下方和右下方还没有遍历到,无需遍历)
class Solution {
public:vector<vector<string>>res;bool isvald(int row,int lie,vector<string>&mids,int n){//检查列for(int i=0;i<row;i++){if(mids[i][lie]=='Q')return false;}//检查左上方for(int i=row-1,j=lie-1;i>=0 && j>=0;i--,j--){if(mids[i][j]=='Q')return false;}//检查右上方for(int i=row-1,j=lie+1;i>=0 && j<n;i--,j++){if(mids[i][j]=='Q')return false;}return true;}void backtrace(vector<string>&mids,int n,int row){if(row==n){res.push_back(mids);return;}for(int i=0;i<n;i++){//列的遍历if(isvald(row,i,mids,n)){//判断该位置是否有效mids[row][i]='Q';backtrace(mids,n,row+1);//传入的是下一行不是下一列mids[row][i]='.';}}}vector<vector<string>> solveNQueens(int n) {vector<string>mids(n,string(n,'.'));//二维数组初始化backtrace(mids,n,0);return res;}
};
37.解数独
思路:二维遍历,递归判断
class Solution {
public:bool backtrace(vector<vector<char>>&board){for(int i=0;i<board.size();i++){//遍历行for(int j=0;j<board[0].size();j++){//遍历列if(board[i][j]=='.'){for(char k='1';k<='9';k++){if(isValid(i,j,k,board)){board[i][j]=k;if(backtrace(board)) return true;board[i][j]='.';}}return false;//9个数都遍历完都不对,说明这个位置无法插入}}}return true;//遍历完没有返回false,说明完全ok}bool isValid(int row,int col,char val,vector<vector<char>>&board){for(int i=0;i<9;i++){//判断行里是否重复if(board[row][i]==val) return false;}//判断列里是否重复for(int i=0;i<9;i++){if(board[i][col]==val) return false;}//判断九宫格里是否重复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]==val) return false;}}return true;}void solveSudoku(vector<vector<char>>& board) {backtrace(board);}
};
相关文章:

day-27 代码随想录算法训练营(19)回溯part03
39.组合总和 分析:同一个数可以选多次,但是不能有重复的答案; 思路:横向遍历,纵向递归(不同的是递归的时候不需要跳到下一个位置,因为同一个数可以选多次) class Solution { publ…...
CSDN编程题-每日一练(2023-08-22)
CSDN编程题-每日一练(2023-08-22) 一、题目名称:最长递增区间二、题目名称:K树三、题目名称:小Q的价值无向图一、题目名称:最长递增区间 时间限制:1000ms内存限制:256M 题目描述: 给一个无序数组,求最长递增的区间长度。如:[5,2,3,8,1,9] 最长区间 2,3,8 长度为 3。…...

使用 KubeBlocks 为 K8s 提供稳如老狗的数据库服务
原文链接:https://forum.laf.run/d/994 大家好!今天这篇文章主要向大家介绍 Sealos 的数据库服务。在 Sealos 上数据库后端服务由 KubeBlocks 提供,为用户的数据库应用保驾护航。无论你是在公有云还是本地环境中使用,Sealos 都能为…...

SFL212B-10-21-15、SFL212B-20-21-40喷嘴挡板伺服阀
SFL212B-05-21-10、SFL212B-10-21-15、SFL212B-20-21-40、SFL212-05-32-10、SFL212-10-32-15、SFL212-20-32-40、SFL212A-05-21-10、SFL212A-10-21-15、SFL212A-20-21-40喷嘴挡板力反馈伺服阀,外置伺服放大器,四通,带阀芯阀套的两级伺服阀&am…...

阿里云100元预算可选的云服务器配置2核2G3M带宽
阿里云服务器100元可以买到哪些配置?如果是一年时长,轻量应用服务器2核2G3M带宽一年108元,系统盘为50GB高效云盘。以前阿里云服务器ECS卖过35元一年、69元、88元、89元和99元的都有过,但是现在整体费用上涨,入门级云服…...

Linux问题--docker启动mysql时提示3306端口被占用
问题描述: 解决方法: 1.如果需要kill掉mysqld服务可以先通过 lsof -i :3306 2. 查询到占用3306的PID,随后使用 kill -15 PID 来kill掉mysqld服务。 最后结果...

2023年中秋月饼市场趋势分析(月饼京东销售数据分析)
中秋将至,月饼作为节令食品将再次掀起消费热潮。今年月饼市场的需求如何呢,是更受欢迎还是热度有所降低,结合数据我们一起来看今年月饼市场的销售表现。 在这里,我们分别选取了2022年第31周-32周和2023年第31周-32周(…...
A Survey on Model Compression for Large Language Models
本文是LLM系列文章,关于模型压缩相关综述,针对《A Survey on Model Compression for Large Language Models》的翻译。 大模型的模型压缩综述 摘要1 引言2 方法3 度量和基准3.1 度量3.2 基准 4 挑战和未来方向5 结论 摘要 大型语言模型(LLM…...
读取/加载 properties/yml 配置文件
大家好 , 我是苏麟 , 今天带来一个简单好用的东西 . 读取/加载 properties/yml配置文件 基于PropertiesConfiguration读取配置文件 引入依赖 <!--加载yml资源--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-b…...

UG\NX二次开发 创建中心线
文章作者:里海 来源网站:王牌飞行员_里海_里海NX二次开发3000例,C\C++,Qt-CSDN博客 简介: 下面是在制图模块创建中心线的例子,用的是ufun函数。 效果: 代码: #include "me.hpp"#include <stdio.h> #include <string.h> #include <uf.h>…...
用java语言写一个网页爬虫 用于获取图片
以下是一个简单的Java程序,用于爬取网站上的图片并下载到本地文件夹: import java.io.*; import java.net.*;public class ImageSpider {public static void main(String[] args) {// 确定要爬取的网站URL和本地保存目录String url "https://www.…...
三数之和-LeetCode
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意:答案中不可以包含重复的三元组。 示例 1&a…...

ubuntu 对多CPU统一设置高性能模式
一、问题描述 之前在网上找到的CPU设置高性能模式,只能设置CPU0单个CPU,下述是对多核CPU统一设置工作模式。 二、软件安装与设置 执行下述命令sudo apt-get install indicator-cpufreq,然后重启电脑。此时,界面右上角会出现如下图标…...

志凌海纳 SmartX 携手灵雀云推出全栈云原生联合解决方案
近日,北京志凌海纳科技有限公司(以下简称“SmartX”)与北京凌云雀科技有限公司(以下简称“灵雀云”)联合推出全栈云原生联合解决方案,为客户提供从基础设施到容器云平台的一站式服务,加速客户云…...

排名前 6 位的数学编程语言
0 说明 任何对数学感兴趣或计划学习数学的人,都应该至少对编程语言有一定的流利程度。您不仅会更有就业能力,还可以更深入地理解和探索数学。那么你应该学习什么语言呢? 1.python 对于任何正在学习数学的人来说,Python都是一门很棒…...

arm:day6
实现UART通信: 1.键盘输入一个字符a,串口工具显示b 2.键盘输入一个字符串"nihao",串口工具显示"nihao" uart.h #ifndef __UART4_H__ #define __UART4_H__#include "stm32mp1xx_uart.h" #include "stm32mp1xx_gpio.h" #in…...

MyBatis快速入门以及环境搭建和CRUD的实现
目录 前言 一、MyBatis简介 1.MyBatis是什么 2.MyBatis的特点 3.mybatis的作用 4.MyBatis的应用场景 5.MyBatis优缺点 二、相关概念 1.ORM概述 2.常见的ORM框架 3.什么是持久层框架 三、MyBatis的工作原理 1.框架交互 2.工作原理 编辑 四、MyBatis环境搭建 1…...

基于Pytorch实现的声纹识别系统
前言 本项目使用了EcapaTdnn、ResNetSE、ERes2Net、CAM等多种先进的声纹识别模型,不排除以后会支持更多模型,同时本项目也支持了MelSpectrogram、Spectrogram、MFCC、Fbank等多种数据预处理方法,使用了ArcFace Loss,ArcFace loss…...

Fast DDS (2)
1、结构: Fast DDS的架构如下图所示,可以看到以下不同环境的层模型: 应用层:利用Fast DDS API 在分布式系统中实现通信的用户应用程序。Fast DDS层:DDS 通信中间件的稳健实现。它允许部署一个或多个 DDS 域ÿ…...
HarmonyOS/OpenHarmony应用开发-ArkTS语言渲染控制if/else条件渲染
ArkTS提供了渲染控制的能力。条件渲染可根据应用的不同状态,使用if、else和else if渲染对应状态下的UI内容。说明:从API version 9开始,该接口支持在ArkTS卡片中使用。一、使用规则 支持if、else和else if语句。 if、else if后跟随的条件语句…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)
目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 (1)输入单引号 (2)万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...
LangFlow技术架构分析
🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...
pycharm 设置环境出错
pycharm 设置环境出错 pycharm 新建项目,设置虚拟环境,出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...
云原生周刊:k0s 成为 CNCF 沙箱项目
开源项目推荐 HAMi HAMi(原名 k8s‑vGPU‑scheduler)是一款 CNCF Sandbox 级别的开源 K8s 中间件,通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度,为容器提供统一接口,实现细粒度资源配额…...