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后跟随的条件语句…...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
区块链技术概述
区块链技术是一种去中心化、分布式账本技术,通过密码学、共识机制和智能合约等核心组件,实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点:数据存储在网络中的多个节点(计算机),而非…...
高效的后台管理系统——可进行二次开发
随着互联网技术的迅猛发展,企业的数字化管理变得愈加重要。后台管理系统作为数据存储与业务管理的核心,成为了现代企业不可或缺的一部分。今天我们要介绍的是一款名为 若依后台管理框架 的系统,它不仅支持跨平台应用,还能提供丰富…...
【Qt】控件 QWidget
控件 QWidget 一. 控件概述二. QWidget 的核心属性可用状态:enabled几何:geometrywindows frame 窗口框架的影响 窗口标题:windowTitle窗口图标:windowIconqrc 机制 窗口不透明度:windowOpacity光标:cursor…...
运行vue项目报错 errors and 0 warnings potentially fixable with the `--fix` option.
报错 找到package.json文件 找到这个修改成 "lint": "eslint --fix --ext .js,.vue src" 为elsint有配置结尾换行符,最后运行:npm run lint --fix...
