[LeetCode]全排列I,II

devtools/2025/2/7 21:52:04/

全排列I

给定一个不含重复数字的整数数组 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]]

思路:

对于递归问题,很多时候动笔画一画,答案就出来的差不多了,区别就是每一层干的事不一样。递归问题里可以将一些变量设为全局的,减少传参,方便一点。

将vector<vector<int>> ret和vector<int> path 设为全局

全排列I每层要干的事即:遍历nums数组,如果之前没用过,就插入到path数组中,直到path的大小跟nums一样,就将path插入到ret数组

涉及快速查找之前是否使用过,那这里就要用哈希。用unordered系列就有点夸张了,因为nums每个数字都是不重复的,所以搞个同等规模的bool check[n]即可,标记对应位置是否之前使用过

别搞个unordered_set<int> hash,hash.insert(nums[i])来查找,太小巫见大巫了

使用过就continue,换下一个数字来——这里就是所谓的剪枝操作

代码: 

class Solution {vector<vector<int>> ret;vector<int> path;//unordered_set<int> hash;bool check[7];int n;
public:vector<vector<int>> permute(vector<int>& nums) {n=nums.size();dfs(nums);return ret;}   void dfs(vector<int>& nums){if(path.size()==n){ret.push_back(path);return;}for(int i=0;i<n;i++){//被使用过if(check[i]) continue;//没被使用过path.push_back(nums[i]);check[i]=true;dfs(nums);path.pop_back();check[i]=false;}}};

全排列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]]

思路:这里nums的元素是可以重复的,示例1的前两个1虽然值相等,但是不是真正的同一个数字。相对于全排列I,其实就是多了一个剪枝操作

1.同一个节点不使用值相同的数字

2.同一个数字不能被重复使用

代码:

class Solution {vector<vector<int>> ret;vector<int> path;bool check[9];//unordered_set<int> isExist;int n;
public:void dfs(vector<int>& nums){if(path.size()==n){ret.push_back(path);return;}for(int i=0;i<n;i++){//if(isExist.count(nums[i])) break;//同一层中不使用相同的数字——去重//先将数组排序if(check[i]||(i!=0&&nums[i]==nums[i-1]&&check[i-1]==false)) continue;path.push_back(nums[i]);check[i]=true;dfs(nums);path.pop_back();check[i]=false;}}vector<vector<int>> permuteUnique(vector<int>& nums) {sort(nums.begin(),nums.end());n=nums.size();dfs(nums);return ret;}
};

 


http://www.ppmy.cn/devtools/156938.html

相关文章

【SQL技术】不同数据库引擎 SQL 优化方案剖析

一、引言 在数据处理和分析的世界里&#xff0c;SQL 是不可或缺的工具。不同的数据库系统&#xff0c;如 MySQL、PostgreSQL&#xff08;PG&#xff09;、Doris 和 Hive&#xff0c;在架构和性能特点上存在差异&#xff0c;因此针对它们的 SQL 优化策略也各有不同。这些数据库中…

安装和卸载RabbitMQ

我的飞书:https://rvg7rs2jk1g.feishu.cn/docx/SUWXdDb0UoCV86xP6b3c7qtMn6b 使用Ubuntu环境进行安装 一、安装Erlang 在安装RabbitMQ之前,我们需要先安装Erlang,RabbitMQ需要Erlang的语言支持 #安装Erlang sudo apt-get install erlang 在安装的过程中,会弹出一段信息,此…

GitHub Copilot 越狱漏洞

研究人员发现了两种操控 GitHub 的人工智能&#xff08;AI&#xff09;编码助手 Copilot 的新方法&#xff0c;这使得人们能够绕过安全限制和订阅费用、训练恶意模型等。 第一种技巧是将聊天交互嵌入 Copilot 代码中&#xff0c;利用 AI 的问答能力&#xff0c;使其产生恶意输…

upload-labs通关

前言 我们下面进行下一个漏洞——文件上传的学习。文件上传是常见漏洞之一&#xff0c;是Web安全入门必学漏洞。为探讨清楚文件上传漏洞的诸多细节&#xff0c;我们特以经典的upload-labs进行从入门到进阶的专项训练。 在做题过程中&#xff0c;作者把用到的知识进行了全面、…

计算机毕业设计Python+Vue.js游戏推荐系统 Steam游戏推荐系统 Django Flask 游 戏可视化 游戏数据分析 游戏大数据 爬虫

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

QT简单实现验证码(字符)

0&#xff09; 运行结果 1&#xff09; 生成随机字符串 Qt主要通过QRandomGenerator类来生成随机数。在此之前的版本中&#xff0c;qrand()函数也常被使用&#xff0c;但从Qt 5.10起&#xff0c;推荐使用更现代化的QRandomGenerator类。 在头文件添加void generateRandomNumb…

微服务知识——微服务拆分规范

文章目录 一、微服务拆分规范1、高内聚、低耦合2、服务拆分正交性原则3、服务拆分层级最多三层4、服务粒度适中、演进式拆分5、避免环形依赖、双向依赖6、通用化接口设计&#xff0c;减少定制化设计7、接口设计需要严格保证兼容性8、将串行调用改为并行调用&#xff0c;或者异步…

MATLAB | 基于长时间序列栅格数据的Mann-Kendall与Pettitt突变检验分析

各位同学好&#xff0c;今天我们将分享在水文气象等领域中常用的两种突变检验方法——Mann-Kendall&#xff08;MK&#xff09;检验和Pettitt检验。由于时间关系&#xff0c;今天我们不详细介绍具体的公式和推导过程&#xff0c;感兴趣的同学可以参考相关文献&#xff0c;如《P…