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

Vitis HLS 学习指南与实践教程 Vitis HLS 学习指南与实践教程摘要:本文系统介绍了AMD Vitis HLS工具及其应用。HLS技术将C/C++代码自动转换为硬件描述语言,显著提升FPGA开发效率(5-10倍)。文章对比了HLS与传统RTL设计的优势,包括抽象级别高、开发周期短、代码重用性强等特点。详细讲解了Vitis HLS工具链的核心功能,包括支持的C/C++特性(如任意精度数据类型)、开发流程(项目创建-代码编写-仿真-综合)以及关键优化技术(流水线、循环展开、数组分割等编译指示)。通过具体代码示例展示了HLS设计方法,为F 阅读详情

491.递增子序列

题目链接
给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。

数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。
在这里插入图片描述

思路: 和上一题很像,但是这道题不能先排序再去重,并且不能使用used进行去重。
1、使用哈希表进行去重,然后再判断相关的条件
2、各种相关的判断条件需要从题目中读到

if (path.size() > 1) {
            result.push_back(path);
            // 注意这里不要加return,要取树上的节点
        }

总体代码如下:

class Solution {
public:
    vector<int> path;
    vector<vector<int>> result;
    void backtracking(vector<int>& nums, int startIndex) {
        if (path.size() >=2 ) { // 至少两个元素
            result.push_back(path);
        }

        unordered_set<int> uset;
        for (int i = startIndex; i < nums.size(); i++) {
            if ( (!path.empty() && path.back() > nums[i]) || 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 result;
    }
};

还可以使用数组做哈希,时间花费更短

int hashSet[201] = {0};
        for (int i = startIndex; i < nums.size(); i++) {
            if ( (!path.empty() && path.back() > nums[i]) || hashSet[nums[i] + 100] == 1 ) {
                continue;
            } 
            hashSet[nums[i] + 100] = 1;
            path.push_back(nums[i]);
            backtracking(nums, i+1);
            path.pop_back();

这里能用数组做哈希是因为题目的要求 -100 <= nums[i] <= 100,那么对应的元素就是200个,可以多加一点,防止溢出。

总结: 这道题和子集II很像,需要注意的点也很类似,但是这道题不能够再用used数组进行去重了,因为这道题不能排序。

46.全排列

题目链接
给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
在这里插入图片描述
首先排列是有序的,也就是说 [1,2] 和 [2,1] 是两个集合,这和之前分析的子集以及组合所不同的地方。
可以看出元素1在[1,2]中已经使用过了,但是在[2,1]中还要在使用一次1,所以处理排列问题就不用使用startIndex了。但排列问题需要一个used数组,标记已经选择的元素,如图橘黄色部分所示:
在这里插入图片描述
used数组,其实就是记录此时path里都有哪些元素使用了,一个排列里一个元素只能使用一次。

class Solution {
public:
    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; // path里已经收录的元素,直接跳过
            used[i] = true;
            path.push_back(nums[i]);
            backtracking(nums, used);
            path.pop_back();
            used[i] = false;
        }
    }
    vector<vector<int>> permute(vector<int>& nums) {
        result.clear();
        path.clear();
        vector<bool> used(nums.size(), false);
        backtracking(nums, used);
        return result;
    }
};

总结: 对于本题,关键点就是区分组合和排列,组合问题,{1,2}和{2,1}是同一个,所以只能算一个,所以在递归的时候使用startIndex来保证位置参数,在排列问题,上面的描述算两个排列,所以在递归中不使用startIndex来控制,但是为了保证每个元素只使用了一次,要用used数组来进行“树枝去重”。
对本题需要注意的点就在used数组控制的是对应位置的下标,不能搞混。

47.全排列 II

题目链接
给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。
在这里插入图片描述

思路: 求有关的排列问题,这道题的关键在数组中出现了重复元素,需要进行树层去重和树枝去重,还是需要使用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++) {
            // used[i - 1] == true,说明同一树枝nums[i - 1]使用过
            // used[i - 1] == false,说明同一树层nums[i - 1]使用过 
            // 如果同一树层nums[i - 1]使用过则直接跳过
            if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false) {
                continue;
            }
            if (used[i] == false) {
                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();
        sort(nums.begin(), nums.end()); // 排序
        vector<bool> used(nums.size(), false);
        backtracking(nums, used);
        return result;
    }
};

总结: 本题我主要卡在了树枝去重的时候忘记放在if语句中了,还不够熟练,需要多刷。

Matlab实战:用递归最小二乘法(RLS)搞定动态系统参数辨识(附完整代码) 本文通过Matlab实战,详细介绍了如何利用递归最小二乘法(RLS)进行动态系统参数辨识。文章从理论优势切入,提供了完整的仿真数据生成、RLS算法核心实现代码,并对参数收敛过程、预测误差及不同遗忘因子的影响进行了可视化分析与性能评估,为工程实践提供了清晰的指南。 阅读详情

相关推荐

px3 有感分析

px3 后续分析

qq_39707917的博客 3117

回溯算法14:递增子序列

给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。 数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。

Ge_yangwen的博客 882

linux下wayland协议修改键盘映射

linux下wayland协议,修改键盘映射,实验环境是Ubuntu24,其他wayland协议窗口应该也是可以的。

qq_15027967的博客 1068

491. 递增子序列(回溯算法)

给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。 数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。 示例 1: 输入:nums = [4,6,7,7] 输出:[[4,6],[4,6,7],[4,6,7,7],[4,7],[4,7,7],[6,7],[6,7,7],[7,7]] 示例 2: 输入:nums = [4,4,3,2,1] 输出:[[4,4]] 提示: 1 <= nums.len

YXXXYX的博客 761

GPU大规模集群运维

CUDA(Compute Unified Device Architecture),是显卡厂商NVIDIA推出的通用并行计算平台和程序模型,该架构使GPU能够解决复杂的计算问题。它包含了CUDA指令集架构(ISA)以及GPU内部的并行计算引擎。开发人员可以使用C语言来为CUDA架构编写程序,所编写出的程序可以在支持CUDA的处理器上以超高性能运行。CUDA官方文档CUDA的软件环境允许开发者使用C++等高级编程语言开发程序。

weixin_42795092的博客 1740

电脑卸载神器Revo Uninstaller Pro,彻底清残留,终身无限制使用

打开软件后,它会自动扫描并列出电脑里所有已安装的程序,小到各种插件、大到专业设计软件和驱动程序,哪怕是隐藏的系统组件,都能给你扒出来,还会自动分类整理,加上搜索功能能快速定位目标软件,就算是电脑小白,也能轻松上手。卸载彻底无残留:能直接代替系统自带的 “添加 / 删除程序”,不光能正常卸载软件,还会通过内置卸载程序配合残留扫描,把软件留下的残留文件、垃圾还有注册表项都扫得明明白白,扫描强度有三档可以选,想清理得多干净都能自己定,删除之后电脑立马清爽不少。电脑用久了是不是越来越慢?

qq_75153390的博客 1750

Leetcode:491. 递增子序列(C++)

给你一个整数数组nums,找出并返回所有该数组中不同的递增子序列,递增子序列中至少有两个元素。你可以按任意顺序返回答案。

Cosmoshhhyyy的博客 813

告别Qt Creator!VSCode + QMake + MinGW:从零搭建高效Qt开发环境

本文详细介绍了如何使用VSCode替代Qt Creator搭建高效的Qt开发环境,涵盖VSCode配置、QMake与MinGW集成、智能提示优化及构建调试技巧。通过实战案例展示如何提升开发效率30%以上,特别适合中大型Qt项目开发。

weixin_30466039的博客 244

LeetCode491. 递增子序列(day0022_2)

给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。示例 1: 示例 2: 提示:1 ...

distant_Rove666的博客 276

YOLOv8 改进:使用 MobileNetV3 轻量化架构改进特征提取网络

通过使用 MobileNetV3 作为 YOLOv8 的特征提取器,能够显著降低模型复杂度和运行时资源消耗,同时在一定程度上保持检测精度。这种方法特别适合需要高效计算的边缘设备和嵌入式系统。

走向CTO的路上... 1276

【ESD专题】从原理上分析TVS管PCB Layout的经验法则

我们常常会听到的一些经验法则,按这些经验法则去做,一般也不会有什么问题,但是到底是为什么呢? 没有从原理上分析和证明的时候,往往在Layout之后还要担心实际测试结果怎么样。或是在实际测试出问题后,根本无法进行分析,难道说修改一个版本就好了?那要从哪里修改呢?也无从下手呀。...

一点硬件 1447

第七章 回溯算法 part04

给你一个整数数组nums,找出并返回所有该数组中不同的递增子序列,递增子序列中。你可以按返回答案。数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。

a781333978的博客 444

PCL 计算点云AABB包围盒的体积【2026最新版】

AABB包围盒又称了 轴对齐包围盒,是点云包围盒里最简单的一种,其计算方法也极其简单。获取包围盒之后,根据包围盒的长宽高进行体积计算即可!博客长期更新,本文最近一次更新时间为:2026年5月3日。

点云侠的博客 2295

代码随想录算法训练营第二十九天|Leetcode491 递增子序列、Leetcode46 全排列、Leetcode47 全排列 II

需要continue,当元素未被选择过则将used[i]置为true并将元素加入path中,回溯过程需要重新将used[i]置为false并弹出path中最后一个元素。输出:[[4,6],[4,6,7],[4,6,7,7],[4,7],[4,7,7],[6,7],[6,7,7],[7,7]]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

Demok123的博客 1020

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

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

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

qq_51395785的博客 1182

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

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

排列问题,每次都要从头开始搜索,例如元素1在[1,2]中已经使用过了,但是在[2,1]中还要再使用一次1。本题给出的示例,还是一个有序数组 [4, 6, 7, 7],这更容易误导大家按照排序的思路去做了。给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2。给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。而本题求自增子序列,是不能对原数组进行排序的,排完序的数组都是自增子序列了。这又是子集,又是去重,是不是不由自主的想起了刚刚讲过的。

weixin_48040500的博客 725

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

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

回溯三部曲:参数为result,list,nums,和用于记录当前树枝元素使用情况的数组used,由于nums[i]仅仅在-10到10之间,且nums[i]中的元素不会重复,所以used可以初始化为21个全0元素;单层遍历逻辑为,对于nums中的所有元素,如果used[nums[i]+10]被用过,直接跳过当前循环,否则将其加入list,调用回溯函数继续遍历nums,出来后将list最后一个元素弹出即可。参数为result,list,nums,和用于记录当前树枝元素使用情况的数组used;

qq_42973684的博客 682

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

去重是横向遍历时需要做的事情,可以使用一个unordered_set,在每一层遍历时,判断当前遍历的元素是否已经遍历过,如果遍历过,那么就跳过。这里需要判断去重,去重的方法是:横向遍历过程中,判断该下标对应的元素是否已遍历过,如果已遍历过,则跳过。也可以不用unordered_set,对nums排序,然后在横向遍历时,判断当前元素与上一个元素是否相同,如果相同则跳过。分为横向和纵向两个维度的遍历,横向遍历是遍历当前元素,添加入路径path,纵向遍历是递归地遍历path的下一个元素。

owlmo的博客 994

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

之前都是借助了一个元素都是bool类型的数组used数组来实现去重,这个不行,因为之前使用used数组之前,都对原始的输入数组进行了排序,这道题不能排序。返回值为void,输入有数组nums,同时因为求得是子序列,不能对同一个元素重复使用,输入还要有int类型的startIndex来控制位置。当收集元素的数组path的大小达到和nums数组一样大的时候,说明找到了一个全排列,也表示到达了叶子节点。本题与上题相比,不同的地方在于本题的数组里有重复的元素,需要去重。我们去重的对象是同一父节点下的同层。

m0_63255131的博客 791

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

输出数组中的所有非递减子序列,数组中和序列中可能存在重复元素,但结果的序列集不能有重复的序列。:其实回溯的题很多都很相似啊,模版化有点重。本质就是无法确定需要套几层for循环,只能用回溯。这道题区别在于,因为要找原数组的非递减序列,所以不能改变原数组序列顺序,但仍要去重。去重的本质就是同一层一个数字只能访问一次,同一层的结点就是每个for循环,每个分支就是递归,所以只需要在for前标记单层的数字访问情况,即可去重。[-100,100]

XiaoKeer666的博客 430

代码随想录算法训练营第二十九天| LeetCode491.递增子序列、LeetCode46.全排列、LeetCode47.全排列II

3.排列类的问题不需要用startIndex标记取过的元素,但是需要用used数组标记取过的元素,组合问题之所以要用startIndex标记,是因为避免出现相同元素不同顺序的情况,但是排列问题是可以出现这种情况的,同一树层取过的元素是可以重复取的,只需要避免同一树枝重复的现象即可。因为set的作用只是记录当前递归的数值有没有重复,每一层递归,都会定义一个新的set,因此不用将元素从set移除!如果path不为空,且当前元素小于当前path里的最后一个元素,或者uset里存在当前元素。

m0_64514622的博客 730

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

leetcode 491 递增子序列 46 全排列 47 全排列 II

qq_42218240的博客 240

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

可以看出元素1在[1,2]中已经使用过了,但是在[2,1]中还要在使用一次1,所以处理排列问题就不用使用startIndex了。本题给出的示例,还是一个有序数组 [4, 6, 7, 7],这更容易误导大家按照排序的思路去做了。给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2。而本题求自增子序列,是不能对原数组进行排序的,排完序的数组都是自增子序列了。给定一个 没有重复 数字的序列,返回其所有可能的全排列。这又是子集,又是去重,是不是不由自主的想起了刚刚讲过的。

wufaqidong1的博客 1024

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

无

fan15157721331的博客 222

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

1.首先排列是有序的,也就是说 [1,2] 和 [2,1] 是两个集合,这和之前分析的子集以及组合所不同的地方。​ ③处理逻辑:1.要满足path的最后一个元素小于当前要收集的元素,否则continue。②参数:可以传入两个数组,分别用来记录树层之间的重复和树枝之间的重复(代码有点冗余)​ ②参数:就传入一个保证每次遍历不重复的startIndex即可。,如果当前树层有重复的元素,那么遍历到第二个重复的元素自动跳过不收集。①终止条件:当收集的元素个数等于nums数组的长度的时候收集。

m0_63941306的博客 126
上一篇: 代码随想录算法训练营第二十八天| 93.复原IP地址 78.子集 90.子集II
下一篇: 代码随想录算法训练营第三十天| 332.重新安排行程 ● 51. N皇后 ● 37. 解数独 ● 总结 (未完成)
RuojiFW
博客等级 码龄9年 2粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值