第二十九天| 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 无…

前端性能优化:提升网站加载速度的终极指南

目录 一、引言 二、问题分析 三、优化方案 1. 减少HTTP请求次数&#xff1a; 方法一&#xff1a;合并文件 方法二&#xff1a;CSS Sprites 方法三&#xff1a;使用CSS和JavaScript工具 2. 使用CDN加速&#xff1a; 方法&#xff1a; 示例&#xff1a; 引入CDN提供的j…

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…

【Linux】Ubuntu 22.04 升级 nodejs 到 v18

Ubuntu 22.04 已经安装的nodejs 版本 nodejs is already the newest version (12.22.9~dfsg-1ubuntu3.3). 删除以前的 nodejs 版本&#xff1a; 1. sudo apt remove nodejs rooterp:~# sudo apt remove nodejs Reading package lists... Done Building dependency tree..…

Docker 基本介绍

Docker 基本介绍 镜像 Docker镜像就是一个只读的模板。 例如&#xff1a;一个镜像可以包含一个完整的ubuntu操作系统环境&#xff0c;里面仅安装了Apache或用户需要的其它应用 程序。 镜像可以用来创建Docker容器。Docker提供了一个很简单的机制来创建镜像或者更新现有的镜…

PHP、Python、Java 和 Go语言对比

PHP、Python、Java 和 Go 都是流行的编程语言&#xff0c;每种语言都有其独特的优势和适用场景。下面是对这些语言的一些基本对比&#xff1a; 一&#xff1a;PHP 适用场景&#xff1a;主要用于Web开发&#xff0c;特别是服务器端脚本。 特点&#xff1a;语法简单易懂&#…

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…

今日头条推出秒真问答 布局抖音口碑时机来了

近来&#xff0c;今日头条对部分业务做出调整。一方面是将“头条百科”升级为“抖音百科”&#xff0c;通过“抖音百科”这个新品牌&#xff0c;更好的为今日头条和抖音的内容场景服务。另外一方面则是&#xff0c;推出全新的问答业务“秒真问答”&#xff0c;目前已经在抖音和…

next项目页面性能调优

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

java生成二维码

1、引入pom依赖 <dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.3.3</version> </dependency> <dependency><groupId>com.google.zxing</groupId><artifact…

Android 自定义BaseFragment

直接上代码&#xff1a; BaseFragment代码&#xff1a; package com.example.custom.fragment;import android.content.Context; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import androidx…

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

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

第十一个知识点:操控BOM对象

BOM&#xff1a;浏览器对象模型 --- B/S、Object、Model window navigator screen location document history window:操作浏览器窗口 //我们可以通过一些指令控制浏览器 window.alert();//弹窗 window.innerwidth;//获取浏览器页面宽度navigator:封装了浏览器的信息…

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…