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

代码随想录算法训练营第23期day28|491.递增子序列 46.全排列 47.全排列 II

目录

一、(leetcode 491)递增子序列

二、(leetcode 46)全排列

三、(leetcode 47)全排列 II


一、(leetcode 491)递增子序列

力扣题目链接

状态:去重方法错误。

这道题和之前全排列的区别就在于不是对同一层的重复元素进行去重,而是去除同一父节点下的重复使用元素,为了达到这个目的,需要使用哈希来判断是否重复,注意到数组中值的大小是-100到100之间,因此可以直接利用哈希数组进行判断

class Solution {
public:vector<vector<int>> res;vector<int> path;void backtracking(vector<int>& nums, int startIndex){if(path.size() >= 2){res.emplace_back(path);}int len = nums.size();int used[201] = {0};for(int i = startIndex; i < len; ++i){if((!path.empty() && path.back() > nums[i]) || used[nums[i] + 100] == 1){continue;}used[nums[i] + 100] = 1;path.emplace_back(nums[i]);backtracking(nums, i+1);path.pop_back();}}vector<vector<int>> findSubsequences(vector<int>& nums) {res.clear();path.clear();backtracking(nums, 0);return res;}
};

二、(leetcode 46)全排列

力扣题目链接

状态:查看思路后AC。

注意全排列和组合(子集)的最大区别在于,全排列的回溯展开每次都是从0开始而不是startIndex,因此需要一个used数组来对已经使用过的节点进行记录,值得注意的是在pop之后,used数组也要进行更新

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

三、(leetcode 47)全排列 II

力扣题目链接

状态:查看思路后也没AC。

这里的去重逻辑和组合中的树层去重逻辑类似,注意细节。

class Solution {
public:vector<vector<int>> res;vector<int> path;void backtracking(vector<int>& nums, vector<bool>& used){if(path.size() == nums.size()){res.emplace_back(path);return;}for(int i = 0; i < nums.size(); ++i){if(i > 0 && nums[i-1] == nums[i] && used[i-1] == true) continue;if(used[i] == false){used[i] = true;path.emplace_back(nums[i]);backtracking(nums, used);

http://www.lryc.cn/news/199849.html

相关文章:

  • ubuntu磁盘扩容
  • C/S架构学习之使用select实现TCP小型并发服务器
  • 公司注册类型分类标准是怎样的
  • 5.MidBook项目经验之MongoDB,Nacos,网关
  • XMLHttpRequest对象的Get请求和Post请求的用法
  • Tomcat动静分离
  • 一些ECharts配置
  • C调用Objective-C的类和方法
  • 驱动开发day1
  • C++ linux vscode编译
  • 卷积神经网络CNN学习笔记
  • Java的Socket Timeout和tcp的存活探测包是不是一个东西
  • 基于跳蛛优化的BP神经网络(分类应用) - 附代码
  • 基于鹈鹕优化的BP神经网络(分类应用) - 附代码
  • 『ARM』和『x86』处理器架构解析指南
  • Android 13.0 系统设置 app详情页默认关闭流量数据的开关
  • 054协同过滤算法的电影推荐系统
  • 分享一个基于JavaWeb的私人牙科诊所预约挂号就诊系统的设计与实现项目源码调试 lw 开题 ppt
  • 从零开始的C++(十一)
  • 驱动开发day2
  • 【CANoe】文件处理_hex文件读取解析
  • 人脸识别顶会论文及源码合集,含2023最新
  • 介绍drawio和图表使用场景
  • leetcode-1438: 绝对差不超过限制的最长连续子数组
  • 【数据结构初阶】九、排序的讲解和实现(直接插入 \ 希尔 \ 直接选择 \ 堆 \ 冒泡 -- C语言)
  • uview组件使用笔记
  • Linux1024一篇通俗易懂的liunx命令操作总结(第十课)
  • nuxt使用i18n进行中英文切换
  • 机器人制作开源方案 | 行星探测车实现WiFi视频遥控功能
  • Angular main 中的enableProdMode