代码随想录算法训练营第二十九天 | 491. 非递减子序列、46. 全排列、47.全排列 II

代码随想录算法训练营第二十九天 | 491. 非递减子序列、46. 全排列、47.全排列 II

  • 491. 非递减子序列
    • 题目
    • 解法
  • 46. 全排列
    • 题目
    • 注意
    • 解法
  • 47.全排列 II
    • 题目
    • 解法
  • 感悟

491. 非递减子序列

题目

在这里插入图片描述

解法

  1. 使用unordered_set去重
class Solution {
private: vector<vector<int>> result;vector<int> path;void backtracking(vector<int>& nums, int startIdx) {if (path.size() >= 2) result.push_back(path);unordered_set<int> used; // 只用于本层for (int i = startIdx; i < nums.size(); i++) {// 递增子序列并不要求在原数组中必须是连续的。递增子序列指的是一个序列中,后一个元素总是大于或等于前一个元素。// 这种子序列可以跨越原数组中的非连续位置if ((!path.empty() && nums[i] < path.back()) || used.find(nums[i]) != used.end()){ //  使用|| 是因为如果使用&&,第三个条件相当于没起作用continue ;} used.insert(nums[i]); // 只用于本层重复元素的排除path.push_back(nums[i]);backtracking(nums, i+1);path.pop_back();}return;}
public:vector<vector<int>> findSubsequences(vector<int>& nums) {result.clear();path.clear();backtracking(nums, 0);return result;}
};

2.因为nums中元素有限,使用数组去重

class Solution {
private: vector<vector<int>> result;vector<int> path;void backtracking(vector<int>& nums, int startIdx) {if (path.size() >= 2) result.push_back(path);int used[201] = {0}; // 因为nums中元素有限,使用数组去重for (int i = startIdx; i < nums.size(); i++) {if ((!path.empty() && nums[i] < path.back()) || used[nums[i] + 100] == 1){ //  使用|| 是因为如果使用&&,第三个条件相当于没起作用continue ;} used[nums[i] + 100] = 1; // 只用于本层重复元素的排除path.push_back(nums[i]);backtracking(nums, i+1);path.pop_back();}return;}
public:vector<vector<int>> findSubsequences(vector<int>& nums) {result.clear();path.clear();backtracking(nums, 0);return result;}
};

46. 全排列

题目

在这里插入图片描述

注意

每层都是从0开始搜索而不是startIndex
需要used数组记录path里都放了哪些元素了

解法

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++) {if (used[i] == true) continue; // 如果已经使用过了,就跳过used[i] = true;path.push_back(nums[i]);backtracking(nums, used);used[i] = false;path.pop_back();}return;}
public:vector<vector<int>> permute(vector<int>& nums) {result.clear();path.clear();vector<bool> used(nums.size(), false);backtracking(nums, used);return result;}
};

47.全排列 II

题目

在这里插入图片描述

解法

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;}// used[i - 1] == true,说明同一树枝nums[i - 1]使用过// used[i - 1] == false,说明同一树层nums[i - 1]使用过// 如果同一树层nums[i - 1]使用过则直接跳过for (int i = 0; i < nums.size(); i++) {if (used[i] == true ) continue; // 如果已经使用过了,就跳过if (i> 0 && used[i-1] == true && nums[i] == nums[i-1]) continue;// 对于同一树层已经使用过的重复元素used[i] = true;path.push_back(nums[i]);backtracking(nums, used);used[i] = false;path.pop_back();}return;}
public:vector<vector<int>> permuteUnique(vector<int>& nums) {result.clear();path.clear();vector<bool> used(nums.size(), false);sort(nums.begin(), nums.end());backtracking(nums, used);return result;}
};

感悟

回溯理解:以下代码为例
for循环是一个树层,

  • 第一个for从 i=0 开始 到 i=nums.size() 结束
  • 第二个for从从 i=1 开始 到 i=nums.size() 结束

backtracking()函数是进入下一树层的门

for (int i = startIndex; i < nums.size(); i++) {path.push_back(nums[i]);backtracking(nums, i + 1);path.pop_back();
}

在这里插入图片描述

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

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

相关文章

Day62:WEB攻防-PHP反序列化CLI框架类PHPGGC生成器TPYiiLaravel等利用

目录 反序列化链项目-PHPGGC&NotSoSecure NotSoSecure(综合类) PHPGGC(单项类) 反序列化框架利用-ThinkPHP&Yii&Laravel [安洵杯 2019]iamthinking Thinkphp V6.0.X 反序列化 CTFSHOW 反序列化 267 Yii2反序列化 CTFSHOW 反序列化 271 Laravel反序列化 知识…

Linux入门-常见指令及权限理解

目录 1、Linux背景 1.1、发展历史 1.2、开源 1.3Linux企业应用现状 2、Linux下的基本命令 2.1、ls 指令 2.2、pwd 命令 2.3、cd 命令 2.4、touch命令 2.5、mkdir 命令 2.6、rmdir 指令和 rm指令 2.7 man 指令 2.8、cp指令 2.9、mv 指令 2.10 cat 2.11 more 2…

掌握 Istio:部署完成后如何运用?

一、环境情况 环境&#xff1a;Ubuntu20.04 机器数量&#xff1a;单机1台 IP&#xff1a;10.9.2.83 二、准备知识 为什么使用 Istio&#xff1f; Istio提供了一种更高级别的服务网格解决方案&#xff0c;它可以简化和加强 Kubernetes 集群中的服务间通信、流量管理、安全…

C++ STL(交集、并集)

交集、并集&#xff1a;set_intersection()、set_union()) 1.交集(求两个数组共同有的元素) #include <bits/stdc.h> using namespace std;const int N 11111;int x[N],y[N];int n;vector<int> vt;int main() {cin>>n;for(int i0;i<n;i) cin>>x[…

如何利用RunnerGo简化性能测试流程

在软件开发过程中&#xff0c;测试是一个重要的环节&#xff0c;需要投入大量时间和精力来确保应用程序或网站的质量和稳定性。但是&#xff0c;随着应用程序变得更加复杂和庞大&#xff0c;传统的测试工具在面对比较繁琐的项目时非常费时费力。这时&#xff0c;一些自动化测试…

Visual Studio 2013 - 输出窗口一闪而过问题解决

Visual Studio 2013 - 输出窗口一闪而过问题解决 1. Visual Studio Console 一闪而过问题解决1.1. set Debug1.2. set Release References 1. Visual Studio Console 一闪而过问题解决 工程 -> 属性 -> 配置属性 -> 链接器 -> 系统 -> 子系统 -> 下拉框 -&g…

进程及进程状态

1.PCB及task_struct 进程信息被放在一个叫做进程控制块的数据结构中&#xff0c;可以理解为进程属性的集合。 书上称之为 PCB &#xff08; process control block &#xff09;&#xff0c; Linux 操作系统下的 PCB 是 : task_struct。 task_struct是PCB的一种。 task_struc…

西瓜书机器学习AUC与ℓ-rank(loss)的联系理解以及证明(通俗易懂)

前言 在学习到这部分时&#xff0c;对 ℓ-rank 以及AUC的关系难以理解透彻&#xff0c;在网上看到其他博主也并未弄明白&#xff0c;大家大多写自己的理解&#xff0c;我希望您在看完这篇文章时能够深刻理解这二者的关系&#xff0c;如果我的理解有误&#xff0c;希望您在评论…

论文翻译 - HotFlip: White-Box Adversarial Examples for Text Classification

论文链接&#xff1a;https://aclanthology.org/P18-2006.pdf 项目代码&#xff1a;https://github.com/AnyiRao/WordAdver HotFlip: White-Box Adversarial Examples for Text Classification Abstract1 Introduction2 Related Work3 HotFlip3.1 Definitions3.2 Derivatives o…

JAVA实战开源项目:无代码动态表单系统(Vue+SpringBoot)

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 动态类型模块2.2 动态文件模块2.3 动态字段模块2.4 动态值模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 动态类型表3.2.2 动态文件表3.2.3 动态字段表3.2.4 动态值表 四、系统展示五、核心代码5.1 查询档案类型5.…

21.python——模块引用

一、语法 *import import <模块名> as <别名> *from...import... from <模块名> import <对象、函数...> 用在不同文件中引用函数 from <模块名> import * #引用该模块中所有函数

MySQL面试题之基础夯实

一、mysql当中的基本数据类型有哪些 MySQL中的基本数据类型包括但不限于以下几大类&#xff1a; 数值类型&#xff1a; 整数类型&#xff1a;TINYINT、SMALLINT、MEDIUMINT、INT&#xff08;INTEGER&#xff09;、BIGINT浮点数类型&#xff1a;FLOAT、DOUBLE、DECIMAL&#xf…

实现接口自动化测试

最近接到一个接口自动化测试的case&#xff0c;并展开了一些调研工作&#xff0c;最后发现&#xff0c;使用pytest测试框架并以数据驱动的方式执行测试用例&#xff0c;可以很好的实现自动化测试。这种方式最大的优点在于后续进行用例维护的时候对已有的测试脚本影响很小。当然…

【NC16589】机器翻译

题目 机器翻译 先进先出 ( F I F O ) (FIFO) (FIFO) 的内存置换算法、队列、哈希表 思路 题目很直观&#xff0c;有一个大小受限的内存&#xff0c;如果内存没装满就装&#xff0c;装满了则将最先装入的那一块换掉&#xff0c;再装新的。 这是一种先进先出 ( F I F O ) (FI…

基于SWAT-MODFLOW地表水与地下水耦合实践技术教程

原文链接&#xff1a;基于SWAT-MODFLOW地表水与地下水耦合实践技术教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247598169&idx3&sn16d726694ca77f9cda3aa95716a18cc1&chksmfa8201becdf588a846bc1d461b8c985536e6191e7288df035e5bef6fc85b933030f…

【二分查找】算法例题

目录 十八、二分查找 114. 搜索插入位置 ① √- 115. 搜索二维矩阵 ② 116. 寻找峰值 ② √- 117. 搜索旋转排序数组 ② 118. 在排序数组中查找元素的第一个和最后一个位置 ② √ 119. 寻找寻钻排序数组中的最小值 ② 120. 寻找两个正序数组的中位数 ③ 136. 直线上最多…

顺序表的动态分配基本操作

#include <stdio.h> #include <stdlib.h>// 顺序表存储空间动态分配 #define InitSize 10 // 顺序表初始长度 typedef int ElemType; // int类型重命名为ElemType&#xff0c;方便后续调整typedef struct { // 定义结构体ElemType *data; // 用静…

Rust Rocket简单入门

简介 Rust中最知名的两个web框架要数Rocket和Actix了&#xff0c;Rocket更注重易用性&#xff0c;Actix则更注重性能。这里只是了解一下Rust下的WebAPI开发流程&#xff0c;就学一下最简单的 Rocket。 Rocket 是一个用于 Rust 的异步 Web 框架&#xff0c;专注于可用性、安全性…

找工作的经验总结一——渠道与简历

关于简历与面试的经验总结&#xff0c;也可以说是关于找工作的方法论。 这里我们用第一性原理的方法论来分析找工作这件事。 首先&#xff0c;我们的目的是什么&#xff1f; 当然是找工作&#xff0c;不论你是大学刚毕业&#xff0c;还是创业失败&#xff0c;或者是在家闲着…

python网络爬虫实战教学——urllib的使用(1)

文章目录 专栏导读1、前言2、urllib的使用3、发送请求3.1 urlopen3.2 request 专栏导读 ✍ 作者简介&#xff1a;i阿极&#xff0c;CSDN 数据分析领域优质创作者&#xff0c;专注于分享python数据分析领域知识。 ✍ 本文录入于《python网络爬虫实战教学》&#xff0c;本专栏针对…