第二十九天| 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://xiahunao.cn/news/2775117.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

win32编程系统BUG(Win32 API中的WM_SETTEXT消息)

由于频繁使用Win32 API中的WM_SETTEXT消息&#xff0c;导致内存占用直线上升。 暂未找到有效解决方案。

Go 语言中如何大小端字节序?int 转 byte 是如何进行的?

嗨&#xff0c;大家好&#xff01;我是波罗学。 本文是系列文章 Go 技巧第十五篇&#xff0c;系列文章查看&#xff1a;Go 语言技巧。 我们先看这样一个问题&#xff1a;“Go 语言中&#xff0c;将 byte 转换为 int 时是否涉及字节序&#xff08;endianness&#xff09;&#x…

Mobile ALOHA 2: An Enhanced Low-Cost Hardware for Bimanual Teleoperation

文章目录 1. Mobile ALOHA 11.1 项目地址 2. Mobile ALOHA 22.1 相关链接2.2 Whats upgraded in II ? Reference Stanford 最新家务机器人 1. Mobile ALOHA 1 Mobile ALOHA: Learning Bimanual Mobile Manipulation with Low-Cost Whole-Body Teleoperation 1.1 项目地址 htt…

《MySQL 简易速速上手小册》第2章:数据库设计最佳实践(2024 最新版)

文章目录 2.1 规划高效的数据库架构2.1.1 基础知识2.1.2 重点案例2.1.3 拓展案例 2.2 数据类型和表设计2.2.1 基础知识2.2.2 重点案例2.2.3 拓展案例 2.3 索引设计原则2.3.1 基础知识2.3.2 重点案例2.3.3 拓展案例 2.1 规划高效的数据库架构 在开启我们的数据库设计之旅之前&a…

解决IntellIJ Idea内存不足

突然有一天我在IDEA打开两个项目时&#xff0c;发生了报错&#xff0c;说我内存不足&#xff0c;我这电脑内存16G怎么会内存不足。下面是我的解决方案。 IntelliJ IDEA 报告内存不足的原因通常与以下几个因素有关&#xff1a; 项目规模较大&#xff1a;如果您正在开发的项目非…

Git的基础操作指令

目录 1 前言 2 指令 2.1 git init 2.2 touch xxx 2.3 git status 2.4 git add xxx 2.5 git commit -m xxxx 2.5 git log及git log --prettyoneline --all --graph --abbrev-commit 2.6 rm xxx 2.7 git reset --hard xxx(含小技巧) 2.8 git reflog 2.9 mv xxx yyy 1…

linux(redhat)重置root密码

首先将root密码改成几乎不可能记住的密码 [rootexample ~]# echo fheowafuflaeijifehowf|passwd --stdin root Changing password for user root. passwd: all authentication tokens updated successfully.重启系统&#xff0c;进入救援模式 出现此页面&#xff0c;按e键 lin…

TOP100 二叉树(三)

11.114. 二叉树展开为链表 给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链表应该同样使用 TreeNode &#xff0c;其中 right 子指针指向链表中下一个结点&#xff0c;而左子指针始终为 null 。展开后的单链表应该与二叉树 先序遍历 顺…

数据结构与算法-链表(力扣附链接)

之前我们对C语言进行了一定的学习&#xff0c;有了一些基础之后&#xff0c;我们就可以学习一些比较基础的数据结构算法题了。这部分的知识对于我们编程的深入学习非常有用&#xff0c;对于一些基本的算法&#xff0c;我们学习之后&#xff0c;就可以参加一些编程比赛了&#x…

vscode终端显示有两个虚拟环境的解决方法

使用vscode的终端时&#xff0c;存在以下现象&#xff1a; 终端显示有两个虚拟环境&#xff0c; 第一个虚拟环境由vscode的python插件选择的解释器产生&#xff1a; 第二个虚拟环境由conda的自动激活虚拟环境产生&#xff1a; vim ~/.bashrc 解决方法是把~/.bashrc文件中的自…

嵌入式系统中的故障容错和恢复机制有哪些常用的方法和技术?

嵌入式系统是一种在特定应用领域内运行的计算机系统&#xff0c;其对系统可靠性和稳定性有着较高的要求。在嵌入式系统中&#xff0c;故障容错和恢复机制是至关重要的&#xff0c;因为它们能够确保系统在面临故障和异常情况时能够继续正常工作或者快速恢复正常状态。本文将介绍…

tab 切换类交互功能实现

tab切换类交互&#xff1a; 记录激活项&#xff08;整个对象/id/index)动态类型控制 下面以一个地址 tab 切换业务功能为例&#xff1a; <div class"text item" :class"{active : activeAddress.id item.id}" click"switchAddress(item)"…

前端学习之路(6) npm详解

npm 是什么&#xff1f; npm&#xff08;node package manager&#xff09;&#xff1a;node.js 的包管理器&#xff0c;用于node插件管理&#xff08;包括安装、卸载、管理依赖等&#xff09; &#xff0c;npm 是随同 node.js 一起安装的包管理工具&#xff0c;能解决 node.j…

JRebel激活-nginx版本

nginx转发流量&#xff08;代替其他网上说的那个工具&#xff09; proxy_pass http://idea.lanyus.com; 工具激活 填写内容说明&#xff1a; 第一行的激活网址是&#xff1a;http://127.0.0.1:8888/ 正确的GUID。GUID 可以通过专门的网站来生成&#xff08;点击打开&#…

zer0pts-2020-memo:由文件偏移处理不正确--引发的堆溢出

启动脚本 #!/bin/sh qemu-system-x86_64 \-m 256M \-kernel ./bzImage \-initrd ./rootfs.cpio \-append "root/dev/ram rw consolettyS0 oopspanic panic1 kaslr quiet" \-cpu kvm64,smep,smap \-monitor /dev/null \-nographic -enable-kvm/ # dmesg | grep page …

倒计时61天

M-智乃的36倍数(normal version)_2024牛客寒假算法基础集训营3 (nowcoder.com) //非ac代码,超时了,54.17/100#include<bits/stdc.h> using namespace std; const int N1e55; const int inf0x3f3f3f3f; #define int long long int n; string s1[N]; void solve() {cin>…

第4章 表单与类视图

学习目标 熟悉Flask处理表单的方式&#xff0c;能够归纳在Flask程序中如何处理表单 掌握Flask-WTF扩展包的安装&#xff0c;能够借助pip工具安装Flask-WTF扩展包 掌握使用Flask-WTF创建表单的方式&#xff0c;能够独立使用Flask-WTF创建表单 掌握在模板中渲染表单的方式&…

《MySQL 简易速速上手小册》第4章:数据安全性管理(2024 最新版)

文章目录 4.1 用户认证和权限控制4.1.1 基础知识4.1.2 重点案例&#xff1a;使用 Python 管理 MySQL 用户权限4.1.3 拓展案例 4.2 防止 SQL 注入和其他安全威胁4.2.1 基础知识4.2.2 重点案例&#xff1a;使用 Python 和 MySQL 进行安全的数据查询4.2.3 拓展案例 4.3 数据加密和…

代码随想录算法训练营day14||二叉树part01、理论基础、递归遍历、迭代遍历、统一迭代

递归遍历 &#xff08;必须掌握&#xff09; 本篇将介绍前后中序的递归写法&#xff0c;一些同学可能会感觉很简单&#xff0c;其实不然&#xff0c;我们要通过简单题目把方法论确定下来&#xff0c;有了方法论&#xff0c;后面才能应付复杂的递归。 这里帮助大家确定下来递归…

licheepi nano 从零开始使用sd卡启动

本文目的&#xff1a;licheepi nano从零开始&#xff0c;使用sd卡启动&#xff1b; 某些原因导致需要重新捣鼓uboot&#xff0c;但过程中频繁出错&#xff0c;后悔最初没有记录详细的操作方法&#xff0c;此帖主要为自己出口气&#xff0c;重新记录&#xff1b; 持续完善&#…