当前位置: 首页 > news >正文

代码随想录算法训练营:26/60

非科班学习算法day26 | LeetCode491:非递减子序列 ,Leetcode46:全排列 ,Leetcode47:全排列|| 


介绍

包含LC的两道题目,还有相应概念的补充。

相关图解和更多版本:

代码随想录 (programmercarl.com)https://programmercarl.com/#%E6%9C%AC%E7%AB%99%E8%83%8C%E6%99%AF


一、LeetCode题目

1.LeetCode491:非递减子序列 

题目链接:491. 非递减子序列 - 力扣(LeetCode)

题目解析

       和前面问题(子集||)最大的区别在于这里不能够排序,所以去重采用更为普遍的set方法;同时关于中止和收集条件要格外注意。

 c++代码如下:

class Solution {
public:// 有重复-不能排序->使用set去重-判断非递减-路径中至少包含2个// 结果vector<vector<int>> res;// 路径vector<int> path;// 回溯函数void backtracking(vector<int>& nums, int index) {if (path.size() >= 2) {res.push_back(path); // 不要return}// 创建setunordered_set<int> uset;for (int i = index; i < nums.size(); i++) {// 不满足剪枝if (!path.empty() && path.back() > nums[i])continue;// 树层去重if (uset.find(nums[i]) != uset.end())continue;uset.insert(nums[i]);path.push_back(nums[i]);backtracking(nums, i + 1);path.pop_back();}}vector<vector<int>> findSubsequences(vector<int>& nums) {backtracking(nums, 0);return res;}
};

注意点1:首先是收集路径,这里是有条件的,要求路径里的元素至少有两个;这里不需要额外写中止条件

注意点2:选用set去重的逻辑是一样的,关键在于理解这个set的位置,set是每一层递归进入时新建的,就负责本层的元素去重记录,所以不需要回溯。

 2.Leetcode46: 全排列 

题目链接:46. 全排列 - 力扣(LeetCode)

题目解析

       排列和组合的区别在于有顺序要求

 C++代码如下: 

class Solution {
public:// 顺序要求-没有重复-收集叶子节点// 结果vector<vector<int>> res;// 路径vector<int> path;// 回溯函数-不需要indexvoid backtracking(vector<int>& nums, vector<bool> used) {if (path.size() == nums.size()) {res.push_back(path); // 需要return结束本层return;}for (int i = 0; i < nums.size(); i++) {if (used[i])continue;path.push_back(nums[i]);used[i] = true;backtracking(nums, used);path.pop_back();used[i] = false;}}vector<vector<int>> permute(vector<int>& nums) {vector<bool> used = vector<bool>(nums.size(), false);backtracking(nums, used);return res;}
};

注意点1:首先明确需求就是,不需要排序也不需要index,因为没有重复元素,而且收集的是叶子节点,内容包含所有元素所以不需要index,借助used数组可以在遍历过程中跳过已经选过的元素。

3.Leetcode47:全排列||

题目链接:47. 全排列 II - 力扣(LeetCode)

题目解析

       参考子集||还有全排列

C++代码如下:

class Solution {
public:// 有重复-排序去重-排列-无index// 结果vector<vector<int>> res;// 路径vector<int> path;// 回溯函数void backtracking(vector<int>& nums, vector<bool> used) {if (path.size() == nums.size()) {res.push_back(path);return;}for (int i = 0; i < nums.size(); i++) {if (i > 0 && nums[i] == nums[i - 1] && !used[i - 1])continue;if (used[i])continue;used[i] = true;path.push_back(nums[i]);backtracking(nums, used);used[i] = false;path.pop_back();}}vector<vector<int>> permuteUnique(vector<int>& nums) {vector<bool> used = vector<bool>(nums.size(), false);sort(nums.begin(),nums.end());backtracking(nums, used);return res;}
};

注意点1:一定要记得排序

 

总结


打卡第 26天,坚持!!!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 通义千问Qwen-VL-Chat大模型本地训练(二)
  • Spring Boot 实现统一异常处理:构建健壮的应用
  • 恢复出厂设置手机变成砖
  • 网关、DHCP协议、ip地址、子网掩码简单介绍
  • 【AutoencoderKL】基于stable-diffusion-v1.4的vae对图像重构
  • 无障碍快捷方式图标
  • centos7安装jenkins
  • Databricks 收购 Tabular 的意义:数据开放框架的胜利
  • 安全防御---防火墙实验1
  • 医疗器械FDA |FDA网络安全测试具体内容
  • 初识Laravel(Laravel的项目搭建)
  • 基于随机森林与XGBoost模型的机器故障关键因素分析
  • linux系统php开机自启动 phpfpm
  • Tomcat的安全配置
  • 运营商二三要素是什么?有什么意义
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • Angular2开发踩坑系列-生产环境编译
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • idea + plantuml 画流程图
  • nfs客户端进程变D,延伸linux的lock
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • React16时代,该用什么姿势写 React ?
  • spring-boot List转Page
  • 大型网站性能监测、分析与优化常见问题QA
  • 我从编程教室毕业
  • 学习JavaScript数据结构与算法 — 树
  • 用Visual Studio开发以太坊智能合约
  • puppet连载22:define用法
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #100天计划# 2013年9月29日
  • #数学建模# 线性规划问题的Matlab求解
  • $.ajax()参数及用法
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (4)Elastix图像配准:3D图像
  • (第三期)书生大模型实战营——InternVL(冷笑话大师)部署微调实践
  • (二十九)STL map容器(映射)与STL pair容器(值对)
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (四)c52学习之旅-流水LED灯
  • (四)图像的%2线性拉伸
  • (转)mysql使用Navicat 导出和导入数据库
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • (轉貼) UML中文FAQ (OO) (UML)
  • ... 是什么 ?... 有什么用处?
  • ./和../以及/和~之间的区别
  • .gitignore
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .net 流——流的类型体系简单介绍
  • .net 中viewstate的原理和使用
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .net6 core Worker Service项目,使用Exchange Web Services (EWS) 分页获取电子邮件收件箱列表,邮件信息字段
  • .net项目IIS、VS 附加进程调试
  • .net中我喜欢的两种验证码
  • /3GB和/USERVA开关