首页 > 编程语言 >「代码随想录算法训练营」第二十二天 | 回溯算法 part4

「代码随想录算法训练营」第二十二天 | 回溯算法 part4

时间:2024-07-27 10:29:15浏览次数:11  
标签:nums isUsed 随想录 back 算法 vector part4 vec size

491. 非递减子序列

题目链接:https://leetcode.cn/problems/non-decreasing-subsequences/
题目难度:中等
文章讲解:https://programmercarl.com/0491.递增子序列.html
视频讲解:https://www.bilibili.com/video/BV1EG4y1h78v/
题目状态:有思路,借助 ChatGPT 通过

思路:

在之前代码的基础上,添加一个set<vector<int>>类型的全局变量,用来跟踪已添加的子序列,来避免重复子序列的存储。

代码:

class Solution {
public:
    vector<vector<int>> res;
    vector<int> vec;
    set<vector<int>> seen;
    
    void backtracking(vector<int> &nums, int startIdx) {
        if(vec.size() >= 2) {
            if(seen.find(vec) == seen.end()) {
                res.push_back(vec);
                seen.insert(vec);
            }
        }
        for(int i = startIdx; i < nums.size(); ++i) {
            if(vec.empty() || nums[i] >= vec.back()) {
                vec.push_back(nums[i]);
                backtracking(nums, i + 1);
                vec.pop_back();
            }
        }
    }
    vector<vector<int>> findSubsequences(vector<int>& nums) {
        backtracking(nums, 0);
        return res;
    }
};

46. 全排列

题目链接:https://leetcode.cn/problems/permutations/
题目难度:中等
文章讲解:https://programmercarl.com/0046.全排列.html
视频讲解:https://www.bilibili.com/video/BV19v4y1S79W/
题目状态:有思路,借助 ChatGPT 通过

思路:

定义一个全局变量vector<bool> isUsed,用来判断当前节点是否已经被回溯到了,若已经用过就直接跳过,之后使用回溯模板。

代码:

class Solution {
public:
    vector<vector<int>> res;
    vector<int> vec;
    vector<bool> isUsed;
    void backtracking(vector<int> &nums) {
        if(vec.size() == nums.size()) {
            res.push_back(vec);
            return;
        }
        for(int i = 0; i < nums.size(); ++i) {
            if(isUsed[i]) continue;
            vec.push_back(nums[i]);
            isUsed[i] = true;
            backtracking(nums);
            vec.pop_back();
            isUsed[i] = false;
        }
    }
    vector<vector<int>> permute(vector<int>& nums) {
        isUsed.resize(nums.size(), false);
        backtracking(nums);
        return res;
    }
};

47. 全排列II

题目链接:https://leetcode.cn/problems/permutations-ii/
题目难度:中等
文章讲解:https://programmercarl.com/0047.全排列II.html
视频讲解:https://www.bilibili.com/video/BV1R84y1i7Tm/
题目状态:有思路,通过

思路:

将上面两题结合一下,分别创建一个vector<bool>的全局变量来判断当前元素是否已经被使用,避免排列出来的单个结果中出现重复的元素;在定义一个set<vector<int>>的全局变量,来判断所有排列中是否出现了重复的排列方案。

代码:

class Solution {
public:
    vector<vector<int>> res;
    vector<int> vec;
    vector<bool> isUsed;
    set<vector<int>> seen;
    void backtracking(vector<int> &nums) {
        if(vec.size() == nums.size()) {
            if(seen.find(vec) == seen.end()) {
                res.push_back(vec);
                seen.insert(vec);
            }
        }
        for(int i = 0; i < nums.size(); ++i) {
            if(isUsed[i]) continue;
            vec.push_back(nums[i]);
            isUsed[i] = true;
            backtracking(nums);
            vec.pop_back();
            isUsed[i] = false;
        }
    }
    vector<vector<int>> permuteUnique(vector<int>& nums) {
        isUsed.resize(nums.size(), false);
        backtracking(nums);
        return res;
    }
};

标签:nums,isUsed,随想录,back,算法,vector,part4,vec,size
From: https://www.cnblogs.com/frontpen/p/18326688

相关文章

  • 双目相机立体匹配算法概述
    这里写目录标题双目相机立体匹配算法概述1.算法分类2.传统算法2.1局部算法2.2全局算法2.3半全局算法3.深度学习算法3.1基于CNN的方法3.2基于GAN的方法3.3基于transformer的方法4.总结5.参考文献双目相机立体匹配算法概述双目立体匹配是计算机视觉中的一个重......
  • 【独家首发】Matlab实现凌日优化算法TSOA优化Transformer-BiLSTM实现负荷数据回归预测
    %假设您有负荷数据load_data和相应的回归标签regression_labels%1.数据预处理%在这一步中,您需要对负荷数据进行适当的预处理,例如归一化、序列化等操作%2.划分数据集为训练集和测试集%这里假设您将数据划分为train_data,train_labels,test_data,test_label......
  • 【独家首发】Matlab实现粒子群优化算法PSO优化Transformer-BiLSTM实现负荷数据回归预
    %假设您有负荷数据load_data和相应的回归标签regression_labels%1.数据预处理%在这一步中,您需要对负荷数据进行适当的预处理,例如归一化、序列化等操作%2.划分数据集为训练集和测试集%这里假设您将数据划分为train_data,train_labels,test_data,test_label......
  • 直播系统,利用关联规则实现推荐算法
    直播系统,利用关联规则实现推荐算法关联规则是以规则的方式呈现直播系统之间的相关性:关联规则(AssociationRules)是反映一个事物与其他事物之间的相互依存性和关联性,是数据挖掘的一个重要技术,用于从大量数据中挖掘出有价值的数据项之间的相关关系。关联规则的经典例子是通......
  • 基于kalman滤波的UAV三维轨迹跟踪算法matlab仿真
    1.程序功能描述      使用卡尔曼滤波对UAV在三维空间场景中的运动轨迹进行预测和估计,最后输出预测轨迹,估计轨迹以及三维空间轨迹估计结果。 2.测试软件版本以及运行结果展示MATLAB2022a版本运行  3.核心程序  fork=1:length(X_direct)-1%第一个......
  • 【LeetCode】141.环形链表、142. 环形链表 II(算法 + 图解)
    Hi~!这里是奋斗的明志,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎~~......
  • 轻量级图像识别算法笔记(一)
    轻量级图像识别算法一、什么是轻量级图像识别算法?为什么要用轻量级图像识别算法?什么是轻量级图像识别算法?​轻量级识别算法是指那些设计和优化以在资源受限环境中高效运行的机器学习和深度学习算法。为什么要使用轻量级图像识别算法?设备限制:很多实际应用场景中,嵌入式......
  • 算法笔记|Day8字符串II
    算法笔记|Day8字符串II☆☆☆☆☆leetcode151.翻转字符串里的单词题目分析代码☆☆☆☆kamacoder55.右旋字符串(待补充)题目分析代码☆☆☆☆☆leetcode28.实现strStr()题目分析代码☆☆☆☆☆leetcode459.重复的子字符串题目分析代码☆☆☆☆☆leetcode151......
  • 2024“钉耙编程”中国大学生算法设计超级联赛(3)
    Preface徐神是我们的红太阳,最后2min切了一道极难的string使得在这场前期爆炸的局面最后没有崩得太难看这场前期的开题顺序有点问题导致前5题出的很慢,中后期开始三人一人写一题,然后经典三开三卡好在最后我在WA了五发后写对拍把B过了,徐神又压线过了string,但比较可惜的......
  • 数学建模竞赛中应掌握的10类算法
    数学建模竞赛中应掌握的10类算法这篇文章是搬运自2004年发表在MATHEMATICALMODELING即《数模》上的一篇文章,作者是董乘宇,曾任SHUMO.COM论坛“编程交流”版版主,获2002年全国大学生数学建模竞赛一等奖。尽管这篇文章至今已经有了整整20年的时间,但考虑到在数学建模领域或者......