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

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

491.非递减子序列

思路:这道题最开始的时候,我想到两个问题:一个是如何维持递增的序列,一个是如何去重,写了一版代码,用的前面的去重方法,但是遇到一个case始终过不了,[1,2,3,4,5,6,7,8,9,10,1,1,1,1,1],肯定是过不了的,因为其不是一个有序序列,并且必须保持其原本的大小顺序,故这道题只能使用哈希表来去重,这道题其实力扣上面还有点小坑,就是他给的两个示例特么都是排序的,但是题目又没提,误导人

错误的思考:

class Solution {
public:vector<vector<int>> result;vector<int> path;void backtracking(vector<int>& nums,int index,vector<bool>& used){if(path.size()>=2){result.push_back(path);}if(index>=nums.size()){return;}for(int i=index;i<nums.size();++i){if(!path.empty() && path.back()>nums[i]) continue;if(i>0&& nums[i-1]==nums[i]&& used[i-1]==false)continue;path.push_back(nums[i]);used[i]=true;backtracking(nums,i+1,used);used[i]=false;path.pop_back();}}vector<vector<int>> findSubsequences(vector<int>& nums) {result.clear();path.clear();vector<bool> used(nums.size(),false);backtracking(nums,0,used);return result;}
};

正确写法:

又学会一种新的去重同一层的方法!

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

46.全排列

思路:第一次接触全排列的问题,体会其与组合,分割问题的不同之处!

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

47.全排列II

思路:这道题就是把前两道题的技巧结合起来了!其这道题可以用used这个数组直接进行去重,其实对于排列问题使用的used数组就是用来标记当前是否使用过的!

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;}unordered_set<int> myset;for(int i=0;i<nums.size();++i){if(used[i]==true||myset.find(nums[i])!=myset.end()) continue;myset.insert(nums[i]);used[i]=true;path.push_back(nums[i]);backtracking(nums,used);used[i]=false;path.pop_back();}}vector<vector<int>> permuteUnique(vector<int>& nums) {result.clear();path.clear();vector<bool> used(nums.size(),false);backtracking(nums,used);return result;}
};
http://www.lryc.cn/news/295491.html

相关文章:

  • (2)(2.14) SPL Satellite Telemetry
  • OTG -- STM32 OTG驱动代码下载及简述(三)
  • STM32F407 CAN参数配置 500Kbps
  • python常用的深度学习框架
  • 将xyz格式的GRACE数据转成geotiff格式
  • 【机器学习】机器学习流程之收集数据
  • IP风险画像在企业网络统计与安全防范中应用
  • Unity类银河恶魔城学习记录3-6 Finalize BattleState源代码 P52
  • 【语音合成】中文-多情感领域-16k-多发音人
  • 07-使用Package、Crates、Modules管理项目
  • spring.jpa.hibernate 配置和源码解析
  • 2019年江苏省职教高考计算机技能考试——一道程序改错题的分析
  • 邦芒支招:职场白领必备的10条护身符
  • python实现飞书群机器人消息通知(消息卡片)
  • 网站服务器中毒或是被入侵该怎么办?
  • Skywalking 学习之ByteBuddy 方法执行时间监控
  • idea vim配置
  • kafka排除zookeeper使用kraft的最新部署方案
  • SQL Server数据库日志查看若已满需要清理的三种解决方案
  • 人工智能 | 深度学习的进展
  • 玩转Java8新特性
  • EasyRecovery2024永久免费版电脑数据恢复软件下载
  • QQ音乐新版客户端的音乐无法解密?来看看解决方法!音乐解锁工具Web+批处理版本合集,附常见问题及解决方法!
  • 2023年12月CCF-GESP编程能力等级认证C++编程一级真题解析
  • 如何决定K8S Pod的剔除优先级
  • 【JavaScript】数据类型
  • JAVA:单例模式提高性能和安全性的优化技巧
  • 如何在 Ubuntu 上安装 ONLYOFFICE 文档 8.0
  • 什么是大模型
  • C#在既有数组中插入另一个数组:Array.Copy方法 vs 自定义插入方法