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

news/2025/1/11 23:58:53/

文章目录

  • 491.递增子序列
    • 思路
    • 代码
    • 总结
  • 46.全排列
    • 思路
    • 代码
    • 总结
  • 47.全排列 II
    • 思路
    • 代码
    • 总结

491.递增子序列

思路

给定数组中可能包含重复数字,相等的数字应该被视为递增的一种情况。

本题其实类似求子集问题,可以不加终止条件

同一父节点下的同层上使用过的元素就不能再使用了

代码

class Solution {
private:vector<vector<int>> result;vector<int> path;void backtracking(vector<int>& nums, int startidx) {if(path.size() > 1) {result.push_back(path);}unordered_set<int> uset;for(int i = startidx; i < nums.size(); i++) {if((!path.empty() && nums[i] < path.back()) || uset.find(nums[i]) != uset.end()) {continue;}path.push_back(nums[i]);uset.insert(nums[i]);backtracking(nums,i+1);path.pop_back();}}
public:vector<vector<int>> findSubsequences(vector<int>& nums) {result.clear();path.clear();backtracking(nums,0);return result;}
};

总结

  1. 第二行的条件语句 uset.find(nums[i]) != uset.end() 检查 uset 容器中是否存在 nums[i] 这个元素。uset.find(nums[i]) 会返回一个迭代器,指向 nums[i] 元素在 uset 容器中的位置,如果元素不存在,则返回 uset.end()。因此,uset.find(nums[i]) != uset.end() 的结果为真表示 nums[i] 在 uset 容器中已经存在。

  2. 对于已经习惯写回溯的同学,看到递归函数上面的uset.insert(nums[i]);,下面却没有对应的pop之类的操作,应该很不习惯吧。这也是需要注意的点,unordered_set uset; 是记录本层元素是否重复使用,新的一层uset都会重新定义(清空),所以要知道uset只负责本层!

  3. 不能对数组进行排序处理的话,去重可以用set做

  4. 因为数值范围小,所以优化可以用数组代替哈希。 数组,set,map都可以做哈希表,而且数组干的活,map和set都能干,但如果数值范围小的话能用数组尽量用数组

46.全排列

思路

排列是有序的
但排列问题需要一个used数组,标记已经选择的元素

代码

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);path.pop_back();used[i] = false;}}public:vector<vector<int>> permute(vector<int>& nums) {result.clear();path.clear();vector<bool> used (nums.size(),false);backtracking(nums,used);return result;}
};

总结

排列问题:

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

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;}for(int i = 0; i < nums.size(); i++) {if(used[i] == true) continue;if( i > 0 && nums[i] == nums[i-1] && used[i-1] == false) {continue;}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();vector<bool> used(nums.size(),false);sort(nums.begin(),nums.end());backtracking(nums,used);return result;}
};

总结

  1. 对于排列问题,树层上去重和树枝上去重,都是可以的,但是树层上去重效率更高!

http://www.ppmy.cn/news/83633.html

相关文章

《Redis-Windows平台下Redis集群的使用》

文章目录 Redis主从集群1.集群结构2.准备实例和配置3.启动4.开启主从关系5.测试Redis主从集群 win-redisx64下载地址 :https://github.com/microsoftarchive/redis/releases 1.集群结构 我们搭建的主从集群结构如图: 共包含三个节点,一个主节点,两个从节点。 这里我们…

影视动画制作中的后期渲染是什么意思?

影视动画制作是一项非常复杂的任务&#xff0c;需要涵盖从剧本创作到角色设计、场景布置、动画制作、后期渲染等多个环节。其中&#xff0c;后期渲染是制作过程中的最后一步&#xff0c;也是非常重要的一步&#xff0c;它可以使得动画画面更加真实、细腻&#xff0c;达到更好的…

H264: [ RTP传H264裸流 ] > 如何传(关注点:H264部分)

RTP传h264裸流, 如何传: 可能有几种情况: 1 一帧传一个NALU(NALU很小) 2 一帧传几个NALU(几个NALU很小)[STAP-A] 3 一帧连一个NALU都传不完(一个NALU很大)[FU-A] 如何解决这些问题?? 单一NALU模式:一帧传一个NALU [rtp帧头] [nalu header] [多媒体数据] 一帧传几个NAL…

SpringSecurity 硅谷通用权限系统:权限管理

由于项目需要 快速入门一下 看的是这篇 比较新比较快 硅谷通用权限系统&#xff1a;权限管理 一、权限管理 1、权限管理介绍 每个系统的权限功能都不尽相同&#xff0c;各有其自身的业务特点&#xff0c;对权限管理的设计也都各有特色。不过不管是怎样的权限设计&#xff0c;大…

基于PHP的毕业设计管理系统的设计与实现(源码+配套论文)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据你想解决的问题&#xff0c;今天给…

一起来学802.11物理层测试标准(11g ERP-1)

通信界&#xff0c;往往喜欢使用奇数代和偶数代的字眼儿&#xff0c;例如蜂窝网络的奇数代1G/3G/5G&#xff0c;偶数代2G/4G/6G&#xff1b;人们往往会有很多总结和评价&#xff1a;奇数代如何如何做铺垫&#xff0c;偶数代如何如何更成功&#xff0c;等等。。。在Wi-Fi中也有类…

关于作用域的那些事(进阶)

一、作用域 原理&#xff1a; 作用域 > 房子 > 除了对象的{}都构成一个作用域 作用域 > 为了区别变量.不同作用域内声明的变量是各不相同的.(就算名字相同). 作用域语法: let x 10; (全局变量). if () {块级作用域 let y 20; (局部变量)} for () {块级作用…

pci 介绍

给大家一个大概的介绍&#xff0c; pci express topology 如何让info, 定义电脑大概的架构是什么样子的。 root complex an rc denotes the root of an I/O hierarchy that connects the CPU/Memory subsystem to the I/O. 就是pcie 最开始的位置。当作是一个pcie cpu 一个连…