回溯算法day24| 491.递增子序列、46. 全排列、47. 全排列 II

回溯算法day24| 491.递增子序列、46. 全排列、47. 全排列 II

  • 491.递增子序列
  • [46. 全排列](https://leetcode.cn/problems/permutations/)
  • [47. 全排列 II](https://leetcode.cn/problems/permutations-ii/)

491.递增子序列

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

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

示例 1:

输入:nums = [4,6,7,7]
输出:[[4,6],[4,6,7],[4,6,7,7],[4,7],[4,7,7],[6,7],[6,7,7],[7,7]]
示例 2:

输入:nums = [4,4,3,2,1]
输出:[[4,4]]

提示:

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

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

难点:

  • 去重的方法:因为这道题不能排序,所以不能用之前的思路去重。这里我们只能用

    unordered_set<int> set;

    来判断是否重复。注意。set不是全局函数,每一个递归函数里面的set都是全新的。也就是说,它只对一层递归有效,**即只对树层重复有效,对树枝重复无效,只是判断这一层的几个分支!**而这我们有意达成的。

易错点:

  • path.empty()时可以直接插入path

46. 全排列

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

示例 1:

输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

示例 2:

输入:nums = [0,1]
输出:[[0,1],[1,0]]

示例 3:

输入:nums = [1]
输出:[[1]]

提示:

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

难点:

  • 需要设置一个used数组来辅助,原理是:每一次递归都从头开始遍历,只有当used数组为false时才有操作,否则跳出。这样的好处是,当前面的元素回溯后变为了false,当前的元素执行完之后,下一层递归就能够使用之前回溯回来的元素了,这就是排列的本质含义

47. 全排列 II

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

示例 1:

输入:nums = [1,1,2]
输出:
[[1,1,2],[1,2,1],[2,1,1]]

示例 2:

输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

提示:

  • 1 <= nums.length <= 8
  • -10 <= nums[i] <= 10
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]==false){path.push_back(nums[i]);used[i]=true;   }elsecontinue;backtracking(nums,used);path.pop_back();used[i]=false;}}vector<vector<int>> permuteUnique(vector<int>& nums) {vector<bool> used(nums.size(),false);sort(nums.begin(),nums.end());backtracking(nums,used);return result;}
};

跟上一题基本一样,只是多一个常规的去重操作,而且这个used数组正好一举两得。

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

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

相关文章

SpringBoot2:请求处理原理分析-接口参数的常用注解

1、PathVariable 作用说明&#xff1a;获取路径参数 案例&#xff1a; 接口收参形式&#xff1a; GetMapping("/car/{id}/owner/{username}")public Map<String,Object> getCar(PathVariable("id") Integer id,PathVariable("username")…

element-ui单元格点击后进入编辑模式的功能

实现一个单元格点击后进入编辑模式的功能。可以通过动态切换组件来实现。 为了在el-table-column中实现单元格单击后变为可编辑的功能&#xff0c;可以使用v-if和v-else来判断当前单元格是否处于编辑状态&#xff0c;并配合数据绑定和事件处理。 代码示例 <el-table-colum…

【uml】graph_legend中的类图怎么看

上图中的方框具有以下含义&#xff1a; 实心灰色方框表示生成图表的结构或类。 带黑色边框的方框表示已记录的结构或类。 带灰色边框的方框表示未记录的结构或类。 带红色边框的方框表示未显示所有继承/包含关系的已记录的结构或类。如果图表不适合指定的边界&#xff0c;则图…

雷电9模拟器安装magisk和lsposed

模拟器环境配置 1、开启root 2、开启System.vmdk可写入 安装magisk 1、新建模拟器、开启root权限、并安装debug版magisk 下载地址去上面吾爱论坛作者文章下载吧&#xff01;支持他一下&#xff01; 2、打开magisk的app&#xff0c;点击安装 如果弹出获取权限&#xff0c;直接…

《A Few Useful Things to Know about Machine Learning》论文导读

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl机器学习作为人工智能领域的重要分支,近年来得到了广泛的关注和应用。Pedro Domingos的经典论文《A Few Useful Things to Know about Machine Learning》为我们提供了对机器学习深入且全面的理解…

前端代码规范- Commit 提交规范

什么是约定式提交 约定式提交&#xff08;Conventional Commits&#xff09;是一种用于代码版本控制的规范&#xff0c;旨在通过明确和标准化提交信息来提高代码协作质量和效率。其基本原则是通过规定提交信息的结构和语义来提高代码版本控制的可读性、可维护性和自动化程度。…

蚁剑webshell连接报错A JavaScript error occurred in the main process

报错如图&#xff1a; 已知解决方式&#xff1a; 将上传shell中文文件名修改为任意的英文文件名即可连接。

uniapp对tabbar封装,简单好用

第一种&#xff0c;效果展示 上代码&#xff0c;新建一个公用组件&#xff0c;tabbar.vue <template><view class"tabbar"><view class"tabbar-item" click"tabbarbtn(0)"><image class"item-image" v-if"…

Unreal Fest 2024 虚幻引擎影视动画制作的普遍问题

一 毛发缓存数据巨大的问题&#xff08;及5个解决方案&#xff09; 在引擎里模拟毛发&#xff0c;并且把它缓存下来&#xff0c;我们就不需要从外部导入了&#xff0c;所以我们要解决的问题就是怎么样在引擎里自由地控制毛发 1.物理场控制 延申 [技术分享]《UE中的世界物理场…

大二上学期计划安排

大二上学期计划安排 学期目标: 加强算法学习,提升算法思维,为以后的算法竞赛做准备学习java知识,学习框架,构建知识体系,深入底层,增强理解增加项目经验,独立完成至少一个项目,并进行交流,优化增强团队凝聚力,营造良好的团队氛围阅读书籍,阅读至少3本以上经典书籍 日常学习安…

第三天旅游线路预览——从贾登峪到禾木风景区入口

第三天&#xff1a;从贾登峪到禾木风景区&#xff0c;晚上住宿贾登峪&#xff1b; 从贾登峪到禾木风景区入口&#xff1a; 1&#xff09;早上9&#xff1a;00起床&#xff0c;吃完早饭&#xff0c;9&#xff1a;30出发&#xff1b; 2&#xff09;从贾登峪到禾木景区售票厅&am…

CSDN文章无水印转成PDF

文章目录 一、打开检查二、点击进入控制台三、在控制台中输入代码 一、打开检查 f11或者右键打开检查 二、点击进入控制台 三、在控制台中输入代码 (function(){ use strict;var articleBox $("div.article_content");articleBox.removeAttr("style&quo…

云计算之大数据(上)

目录 一、Elasticsearch 1.1 产品组件 1.1.1 X-Pack 1.1.2 Beats数据采集中心 1.1.3 Logstash 1.1.4 Kibana 1.2 架构特性 1.2.1 性能 1.2.2 安全性 1.2.3 可用性 1.2.4 可扩展性 1.2.5 可维护性 1.2.6 国际化 1.3 综合检索分析 1.4 全观测 1.5 大数据检索加速…

斑马鱼的超级大脑,光学脑机接口能否解锁生物行为的终极控制?

今天&#xff0c;让我们一起走进一个令人兴奋的科学领域——光学脑机接口&#xff0c;看看科学家们是如何通过这项技术&#xff0c;首次实现了对斑马鱼全脑活动的实时监控和控制。 从科幻到现实的一步之遥 想象一下&#xff0c;如果能够直接读取和影响生物大脑的神经活动&#…

spingboot中创建简单的WebSocket服务和使用OKHttp创建socket客户端接收数据

背景 springboot 中使用okhttp3创建webSocket服务端 server1 和客户端 client1&#xff0c;客户端clinet1调用server1用于发送图片&#xff0c;创建客户端client2接收此图片. 在Spring Boot中使用OkHttp3创建WebSocket服务端和客户端&#xff0c;涉及到两个不同的操作&#xff…

Android使用Room后无法找到字符BR

一般来讲&#xff0c;无法找到BR字符多与Data Binding 相关。 在 Android Studio 中使用 Data Binding 时&#xff0c;如果突然出现 “BR 文件不可用” 或 “找不到符号 BR” 的错误&#xff0c;可能是由以下原因造成的&#xff1a; Data Binding 未启用&#xff1a;确保在你的…

MySQL:进阶巩固-SQL优化

目录 一、INSERT优化1.1 采用批量插入的方式1.2 采用手动提交的方式1.3 主键顺序插入1.4 大批量插入数据 二、主键优化三、ORDER BY 排序优化四、GROUP BY 分组优化五、LIMIT优化六、COUNT优化 一、INSERT优化 1.1 采用批量插入的方式 INSERT INTO tb_user values(1, zhangsa…

标题:深入理解 JavaScript 中的定时器

目录 一、定时器的基本概念 1. setInterval 2. setTimeout 二、代码示例分析 一、定时器的基本概念 在 JavaScript 中&#xff0c;定时器是一种用于在特定时间间隔后执行代码或者重复执行代码的机制。主要包含两种类型的定时器&#xff1a;setInterval和setTimeout。 1. …

K8S 发布应用

前言 昨儿个用 unbuntu20.04 又装了一次K8S 用的 kubeadm containerd Cilium (CNI) 又重新撸了一遍 这里只记录 应用发布的笔记 正文 #创建deployment kubectl create deployment nginx --imagenginx #我这边大约30秒后显示为 ready kubectl get deployments kubectl desc…

3GPP协议入门——物理层基础(一)

1. 频段/带宽 NR指定了两个频率范围&#xff0c;FR1&#xff1a;通常称Sub 6GHz&#xff0c;也称低频5G&#xff1b;FR2&#xff1a;通常称毫米波&#xff08;Millimeter Wave&#xff09;&#xff0c;也称高频5G。 2. 子载波间隔 NR中有15kHz&#xff0c;30kHz&#xff0c;6…