第二十九天| 491.递增子序列 、46.全排列、47.全排列 II

Leetcode 491.递增子序列

题目链接:491 递增子序列

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

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

  • 1 <= nums.length <= 15
  • -100 <= nums[i] <= 100

思考:回溯法。先定义结果集result和节点集node,再考虑回溯函数:

函数参数含义
参数含义
nums题干条件给定数组
startIndex下一层循环搜索的起始位置

 终止条件:如果节点集node中数据个数大于1则将此节点集写入结果集。(此处不可返回,要继续执行下续操作,因为要处理符合条件的各个节点)

单层搜索逻辑:定义set容器记录本层数字使用情况。循环从startIndex开始,如果当前处理数字在容器set中能查询到则说明此数字本层搜索已经使用过。若未使用过则从添加进节点集node的第二个元素开始与节点集尾部元素进行大小比较,若当前数字大则递归处理并回溯,反之跳过此次处理。

代码:

class Solution {
public:vector<vector<int>> result;vector<int> node;void backtracking(vector<int>& nums, int startIndex) {if (node.size() > 1)      //含两个以上元素加入结果集result.push_back(node);unordered_set<int> uset;        //记录本层元素是否重复使用for (int i = startIndex; i < nums.size(); i++) {if (uset.find(nums[i]) != uset.end())       //去重continue;if (node.size() == 0 || nums[i] >= node.back()) {       //除空情况外判断是否升序node.push_back(nums[i]);uset.insert(nums[i]);        //记录当前元素本层已经使用过backtracking(nums, i + 1);node.pop_back();        //回溯}}}vector<vector<int>> findSubsequences(vector<int>& nums) {result.clear();node.clear();backtracking(nums, 0);return result;}
};

优化:以上代码用了unordered_set<int>来记录本层元素是否重复使用。其实用数组来做哈希,效率就高了很多。注意题目中说了,数值范围[-100,100],所以完全可以用数组来做哈希。

代码:

class Solution {
private:vector<vector<int>> result;vector<int> node;void backtracking(vector<int>& nums, int startIndex) {if (node.size() > 1) {result.push_back(node);}int used[201] = {0}; // 这里使用数组来进行去重操作,题目说数值范围[-100, 100]for (int i = startIndex; i < nums.size(); i++) {if ((!node.empty() && nums[i] < node.back())|| used[nums[i] + 100] == 1) {continue;}used[nums[i] + 100] = 1; // 记录这个元素在本层用过了,本层后面不能再用了node.push_back(nums[i]);backtracking(nums, i + 1);path.pop_back();}}
public:vector<vector<int>> findSubsequences(vector<int>& nums) {result.clear();node.clear();backtracking(nums, 0);return result;}
};

Leetcode 46.全排列

题目链接:46 全排列

题干:给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

思考:回溯法。先定义结果集result、路径集path以及记录元素使用情况的数组used,再考虑回溯函数:

函数参数含义
参数含义
nums题干条件给定数组
used记录元素使用情况

 终止条件:如果路径path长度等于数组nums长度则将当前路径path加入结果集。

单层搜索逻辑:从下标0开始循环处理,若当前数字未使用过则递归处理并更新数组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;}for (int i = 0; i < nums.size(); i++) {if (!used[i]) {     //判断当前元素是否使用过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;}
};

Leetcode 47.全排列 II

题目链接:47 全排列 II

题干:给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。

思考一:与上题的区别:给定数组内存在重复元素。故想到单层搜索逻辑中同层元素去重。(当然去重一定先要对元素进行排序)

代码:

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 (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false)        //同层去重continue;if (!used[i]) {     //判断当前元素是否使用过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();sort(nums.begin(), nums.end());     //先将数组排序vector<bool> used(nums.size(), false);      //记录元素使用情况backtracking(nums, used);return result;}
};

自我总结:

  • 同层搜索去重的两种方式
    • 用set来记录本层元素是否重复使用
    • 先对元素进行排序再通过相邻的节点来判断是否重复使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/673676.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

服装设计公司,如何用钉钉实现企业数字化成功转型?

钉钉作为数字化工作平台&#xff0c;为某服装设计公司实现了组织管理的数字化转型&#xff0c;构建了一站式的工作平台。通过钉钉赋能&#xff0c;有利于企业推进组织架构、员工沟通、产品运营和客户服务等方面的数字化、智能化转型。 借助钉钉平台&#xff0c;该服设公司轻松实…

oracle主库增加redo组数

redo log&#xff08;重做日志&#xff09;&#xff1a; 重做日志&#xff1a;简单来说就是&#xff0c;将oracle数据库的DML、DDL&#xff08;数据库操作语言&#xff0c;数据库定义i语言&#xff09;操作记录在日志中&#xff0c;方便恢复及备库使用&#xff0c;以组的方式管…

PCIE Order Set

1 Training Sequence Training Sequence是由Order Set(OS) 组成&#xff0c;它们主要是用于bit aligment&#xff0c;symbol aligment&#xff0c;交换物理层的参数。当data_rate 2.5GT or 5GT 它们不会被扰码(scramble)&#xff0c;当date_rate 8GT or higher 根据特殊的规…

计算机网络-无线通信技术与原理

一般我们网络工程师接触比较多的是交换机、路由器&#xff0c;很少涉及到WiFi和无线设置&#xff0c;但是呢在实际工作中一般企业也是有这些需求的&#xff0c;这就需要我们对于无线的一些基本配置也要有独立部署能力&#xff0c;今天来简单了解一下。 一、无线网络基础 1.1 无…

ruoyi-nbcio中xxl-job的安装与使用

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a; http://122.227.135.243:9666 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; https://gitee.com/nbach…

ChatGPT4 教你如何完成SQL的实践应用

对数据库的各项应用与操作都离不开SQL来对数据进行增删改查。 例如 &#xff1a; 有一张某公司职员信息表如下&#xff1a; 需求1&#xff1a;在公司职员信息表中&#xff0c;请统计各部门&#xff0c;各岗位下的员工人数。 如果这个SQL语句不会写或者不知道怎么操作可以交给…

Excel——分类汇总

1.一级分类汇总 Q&#xff1a;请根据各销售地区统计销售额总数。 第一步&#xff1a;排序&#xff0c;我们需要根据销售地区汇总数据&#xff0c;我们就要对【销售地区】的内容进行排序。点击【销售地区】列中任意一个单元格&#xff0c;选择【数据】——【排序】&#xff0c…

sqli靶场完结篇!!!!

靶场&#xff0c;靶场&#xff0c;一个靶场打一天&#xff0c;又是和waf斗智斗勇的一天&#xff0c;waf我和你拼啦&#xff01;&#xff01; 31.多个)号 先是一套基本的判断 &#xff0c;发现是字符型&#xff0c;然后发现好像他什么都不过滤&#xff1f;于是开始poc 3213131…

next项目页面性能调优

next项目页面性能调优 一般来说性能优化可以分为加载时、运行时两部分的优化。 扩展参考链接&#xff1a; 前端性能优化 24 条建议 Webpack 4进阶–从前的日色变得慢 &#xff0c;一下午只够打一次包 Webpack 分包优化首屏加载 参考指标 FCP&#xff08;First Contentful P…

【网络技术】【Kali Linux】Nmap 嗅探(一)简单扫描

一、实验环境 本次实验进行简单的Nmap扫描&#xff0c;实验使用 Kali Linux 虚拟机和 Ubuntu Linux 虚拟机完成&#xff0c;主机操作系统为 Windows 11&#xff0c;虚拟化平台选择 Oracle VM VirtualBox&#xff0c;如下图所示。 二、实验步骤 1、相关配置 Kali Linux 虚拟机…

OpenCV-32 膨胀操作

膨胀是与腐蚀相反的操作&#xff0c;基本原理是只要保证卷积核的锚点是非0值&#xff0c;周边无论是0还是非0值&#xff0c;都变为0。 使用API---dilate&#xff08;img&#xff0c; kernel&#xff0c; iterationms 1&#xff09; 示例代码如下&#xff1a; import cv2 imp…

【翻译】 Processing的安卓项目构建(译者用的是Android Studio)

原文链接&#xff1a;https://github.com/processing/processing-android/wiki/Building-Processing-for-Android&#xff0c;版本Apr 2, 2023 译者声明&#xff1a;这个文档是开源公开的&#xff0c;协议是GNU协议。译者自己得使用这个文档&#xff0c;所以才翻译的&#xff0…

常用对象和常用成员函数

常量对象与常量成员函数来防止修改对象&#xff0c;实现最低权限原则。 在Obj被定义为常量对象的情况下&#xff0c;下面这条语句是错误的。 错误的原因是常量对象一旦初始化后&#xff0c;其值就再也不能改变。因此&#xff0c;不能通过常量对象调用普通成员函数&#xff0c;因…

Windows Anaconda 运行 gempy examples。示例::

默认读者已安装&#xff1a;Anaconda. 若未安装请参考以下文章&#xff1a; Windows中如何使用 Anaconda 和 gempy地质建模 1&#xff0c;打开Anaconda Navigator: 打开后如此&#xff1a; 运行JupyterLab: launch。 打开gempy example 建模示例&#xff1a; 官方地址&#x…

医学图像安全性概述

参考文献: Insights into security and privacy issues in smart healthcare systems based on medical images 下图左侧是医疗信息共享系统,右侧是计算机辅助诊疗策略: medical image sharing security (MISS)computer-aided diagnostic (CAD)CAD security (CADS)一般在信…

各款Excel、word在线预览工具对比分析以及onlyoffice预览Excel加载时间长的解决方案

对于onlyoffice插件预览慢的问题分析&#xff1a; 研究了一下onlyoffice&#xff0c;得出以下结论&#xff01; 对于预览慢的问题&#xff0c;原因出在文件类型上&#xff0c;文件类型为低版本xls而非新版xlsx文件&#xff0c;onlyoffice服务器会自动将该文件转换为xlsx文件再…

【开源】基于JAVA+Vue+SpringBoot的停车场收费系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 停车位模块2.2 车辆模块2.3 停车收费模块2.4 IC卡模块2.5 IC卡挂失模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 停车场表3.2.2 车辆表3.2.3 停车收费表3.2.4 IC 卡表3.2.5 IC 卡挂失表 四、系统实现五、核心代码…

spring boot和spring cloud项目中配置文件application和bootstrap中的值与对应的配置类绑定处理

在前面的文章基础上 https://blog.csdn.net/zlpzlpzyd/article/details/136065211 加载完文件转换为 Environment 中对应的值之后&#xff0c;接下来需要将对应的值与对应的配置类进行绑定&#xff0c;方便对应的组件取值处理接下来的操作。 对应的配置值与配置类绑定通过 Con…

3.1-媒资管理之需求分析+搭建Nacos

文章目录 媒资管理模块1 模块需求分析1.1 模块介绍1.2 业务流程1.2.1 上传图片1.2.2 上传视频1.2.3 处理视频1.2.4 审核媒资 2.2 搭建Nacos2.2.1 服务发现中心2.2.2 配置中心2.2.2.1 配置三要素2.2.2.3配置content-api 2.2.3 公用配置2.2.4 配置优先级2.2.5 导入配置文件2.2.6 …

机器学习系列 - Mean Shift聚类

文章目录 前言一、原理前置知识点Mean Shift计算步骤 二、应用举例-图像分割三、聚类实战-简单实例bandwidth1bandwidth2总结 前言 Mean Shift&#xff08;均值漂移&#xff09;是基于密度的非参数聚类算法&#xff0c;其算法思想是假设不同簇类的数据集符合不同的概率密度分布…