LeetCode刷题--- 全排列 II

 个人主页:元清加油_【C++】,【C语言】,【数据结构与算法】-CSDN博客

个人专栏

力扣递归算法题

 http://t.csdnimg.cn/yUl2I   

【C++】         

 http://t.csdnimg.cn/6AbpV 

数据结构与算法

 http://t.csdnimg.cn/hKh2l


前言:这个专栏主要讲述递归递归、搜索与回溯算法,所以下面题目主要也是这些算法做的  

我讲述题目会把讲解部分分为3个部分:
1、题目解析

2、算法原理思路讲解

3、代码实现


全排列 II

题目链接: 全排列 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

解法

题目解析

给我们可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列

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

算法原理思路讲解    

因为题⽬不要求返回的排列顺序,因此我们可以对初始状态排序,将所有相同的元素放在各⾃相邻的位置,⽅便之后操作。因为重复元素的存在,我们在选择元素进⾏全排列时,可能会存在重复排列。
我们如何使他们不重复呢?
我们只关心不合法(合法)的分支即可
1.同一个节点的所有分支相同的数字只能用一次
2.同一个数只能用一次
一、画出决策树

 

 决策树就是我们后面设计函数的思路


二、设计代码

(1)全局变量

vector<int> path;          // 存储路径
vector<vector<int>> ret; 
bool check[10] = {false};  
  • 定义⼀个⼆维数组 ret ⽤来存放所有可能的排列
  • ⼀个⼀维数组 path ⽤来存放每个状态的排列
  • ⼀个⼀维数组 check 标记元素 

(2)设计递归函数

void dfs(vector<int>& nums, int pos);
  • 参数:pos(当前需要填⼊的位置);
  • 返回值:⽆;
  • 函数作⽤:查找所有合理的排列并存储在答案列表中

 


 前提:这个数组是有序的

递归流程如下:
  1. 定义⼀个⼆维数组 ret ⽤来存放所有可能的排列,⼀个⼀维数组 path ⽤来存放每个状态的排列⼀个⼀维数组 check 标记元素,然后从第⼀个位置开始进⾏递归;
  2. 在每个递归的状态中,我们维护⼀个步数 pos,表⽰当前已经处理了⼏个数字;
  3. 递归结束条件:当 pos 等于 nums 数组的⻓度时,说明我们已经处理完了所有数字,将当前数组存⼊结果中;
  4. 在每个递归状态中,枚举所有下标 i,若这个下标未被标记,并且在它之前的相同元素被标记过, 则使⽤ nums 数组中当前下标的元素:
    1. 将 check[i] 标记为 true;
    2. 将 nums[i] 添加⾄ path 数组末尾;
    3. 对第 pos+1 个位置进⾏递归;
    4. 将 check[i] 重新赋值为 false,并删除 path 末尾元素表⽰回溯;
  5. 最后,返回 ret


代码实现

  • 时间复杂度:O(n×n!),其中 n 为序列的长度。
  • 空间复杂度:O(n)。我们需要 O(n) 的标记数组,同时在递归的时候栈深度会达到 O(n)O(n)O(n),因此总空间复杂度为 O(n+n)=O(2n)=O(n)
class Solution 
{vector<int> path;          // 存储路径vector<vector<int>> ret; bool check[10] = {false};  void dfs(vector<int>& nums, int pos){if (pos == nums.size()){ret.push_back(path);return;}for (int i = 0; i < nums.size(); i++){if (check[i] == false && (i == 0 || nums[i] != nums[i - 1] || check[i - 1] != false)){path.push_back(nums[i]);check[i] = true;dfs(nums,pos+1);path.pop_back();check[i] = false;}}}
public:vector<vector<int>> permuteUnique(vector<int>& nums) {sort(nums.begin(),nums.end());dfs(nums,0);return ret;}
};

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

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

相关文章

回归预测 | MATLAB实现GA-LSSVM基于遗传算法优化最小二乘向量机的多输入单输出数据回归预测模型 (多指标,多图)

回归预测 | MATLAB实现GA-LSSVM基于遗传算法优化最小二乘向量机的多输入单输出数据回归预测模型 &#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现GA-LSSVM基于遗传算法优化最小二乘向量机的多输入单输出数据回归预测模型 &#xff08;多指标&#…

ISCTF(b)

test_nc nc_shell ls cat flag 这两道题比较像 你说爱我&#xff1f;尊嘟假嘟 打开后重复出现 “ 你说爱我 ” “ 尊嘟 ” “ 假嘟 ” 。判断为 Ook 加密 , 将 “ 你说爱我 ” 替换为 “Ook.” &#xff1b; “ 尊嘟 ” 替换为&#xff1a; “Ook!” &#xff1b; “ 假嘟…

mysql函数(二)之常见字符串函数

MySQL中常见的字符串函数有以下几种&#xff1a; CONCAT()&#xff1a;将两个或多个字符串连接在一起。 用法&#xff1a;CONCAT(string1, string2, ...) 效果图&#xff1a; LENGTH()&#xff1a;返回字符串的长度。 用法&#xff1a;LENGTH(string) 效果图&#xff1a; U…

教你如何使用天眼销查企业客户

天眼销是一款能够帮助客户获取最新的企业联系方式、工商信息等关键数据的平台。 平台基于先进的技术和大数据解决方案&#xff0c;深入挖掘和分析企业信息&#xff0c;能够高效地收集、整理和存储各类企业数据&#xff0c;为用户提供360度视角和洞察&#xff1b;提供全面、准确…

【算法与数据结构】LeetCode55、45、跳跃游戏 I 、II

文章目录 一、跳跃游戏I二、跳跃游戏II三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、跳跃游戏I 思路分析&#xff1a;本题目标是根据跳跃数组的元素&#xff0c;判断最终能够到达数组末端。我们引入了一个跳跃范围…

跨境电商的未来工作方式:远程团队与全球协作

随着数字化时代的来临&#xff0c;跨境电商行业在不断演变&#xff0c;其未来工作方式也呈现出新的趋势。本文将探讨跨境电商未来的工作方式&#xff0c;聚焦于远程团队与全球协作的发展&#xff0c;以揭示这一变革如何重新定义企业的组织结构和工作模式。 远程团队的崛起 近年…

Leetcode—859.亲密字符串【简单】

2023每日刷题&#xff08;六十三&#xff09; Leetcode—859.亲密字符串 &#x1f4a9;山实现代码 class Solution { public:bool buddyStrings(string s, string goal) {int len1 s.size(), len2 goal.size();int cnt 0;int flag 0;int flag2 0;int odd -1;int a[26] …

双指针——找到字符串中的所有字母异位词

https://leetcode.cn/problems/find-all-anagrams-in-a-string/description/?envTypestudy-plan-v2&envIdtop-100-liked 双指针&#xff0c;每次都统计出来p长度的滑动窗口里的数字,拿Arrays.equals进行对比,然后滑动一小格&#xff0c;减1加1继续比对即可。 class Solut…

VS2019, mfc,c++和halcon 2022调试的时候,查询halcon变量的值, 一直提示未为 halconcpp.dll 加载任何符号

在调试看值的过程中&#xff0c;发现这里看不到变量的值。 可以使用halcon变量检查工具查看。

Leetcode—96.不同的二叉搜索树【中等】

2023每日刷题&#xff08;六十四&#xff09; Leetcode—96.不同的二叉搜索树 算法思想 实现代码 class Solution { public:int numTrees(int n) {vector<int> G(n 1, 0);G[0] 1;G[1] 1;for(int i 2; i < n; i) {for(int j 1; j < i; j) {G[i] G[j - 1] * …

多目标跟踪学习

本文来源&#xff1a; 目标跟踪那些事儿-技术和课程介绍_哔哩哔哩_bilibili 为该视频的学习笔记 目的&#xff1a;我的学习目的主要是了解现有的跟踪算法&#xff0c;并着重了解卡尔曼滤波算法&#xff0c;利用卡尔曼滤波算法进行多目标跟踪等后续一系列估计算法。老师视频中提…

harmonyOS 自定义组件基础演示讲解

上文 HarmonyOS组件属性控制 链式编程格式推荐我们讲了一些系统组件 可以传入一些事件和参数 来达到一些不同的效果 其实 我们还可以用自己写的组件 那么 组件这么写&#xff1f; 其实 我们的 page 内部结果 就是一个组件 harmonyOS的概念 万物皆组件 那么 我们就可以在他下面…

产品入门第六讲:Axure中继器

&#x1f4da;&#x1f4da; &#x1f3c5;我是默&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; ​​​​​​ &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《Axure》。&#x1f3af;&#x1f3af; &#x1f680;无论你是编程小白&#xff0c…

ChatGPT引领AI时代:程序员、项目经理、产品经理、架构师、Python量化交易师的翅膀

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 在当今AI时代&#xff0c;ChatGPT作为一项卓越…

信号驱动IO(新)

信号驱动IO是与内核建立SIGIO的信号处理函数并设置回调&#xff0c;当内核有FD就绪时&#xff0c;内核会发出SIGIO信号通知用户进程&#xff0c;在这期间用户应用进程可以执行其他业务&#xff0c;无需阻塞等待。 这个信号驱动IO多好啊&#xff0c;直接替代IO多路复用不好吗&am…

数字化医疗新篇章:构建智能医保支付购药系统

在迎接数字化医疗时代的挑战和机遇中&#xff0c;智能医保支付购药系统的建设显得尤为重要。本文将深入介绍如何通过先进的技术实现&#xff0c;构建一套智能、高效的医保支付购药系统&#xff0c;为全面建设健康中国贡献力量。 1. 引言 随着医疗科技的飞速发展&#xff0c;…

Radzen Blazor 分享

Blazor 是个好东西&#xff0c;可惜在我们这种大环境下&#xff0c;用的人还是少&#xff0c;但是我们不能抵挡先进的生产力&#xff0c;特别是如果您是C#爱好者&#xff0c;更需要不要错过使用这个利器&#xff0c;起码个人开发个基本应用真是快的不得了。 本节只做一个简单的…

echarts饼图扇形之间设置间距

查看文档以及网上查找&#xff0c;都是将边框颜色设置成和背景色一样&#xff0c;但是当背景是图片的时候就不适用了&#xff0c;试了很多方式都不理想&#xff0c;没办法只能从数据上下手了&#xff0c;最终效果如下图&#xff0c; 思路&#xff1a;将list中的数据每一条后面插…

区域和检索算法(leetcode第303题)

题目描述&#xff1a; 给定一个整数数组 nums&#xff0c;处理以下类型的多个查询:计算索引 left 和 right &#xff08;包含 left 和 right&#xff09;之间的 nums 元素的 和 &#xff0c;其中 left < right 实现 NumArray 类&#xff1a;NumArray(int[] nums) 使用数组…

干货教学!!!RHEL8中ansible中常用模块的使用

内容很长各位大老爷耐心观看 本章主要介绍ansible中最常见模块的使用 文件管理模块软件包管理模块服务管理模块磁盘管理模块用户管理模块防火墙管理模块 ansible的基本用法如下 ansible 机器名 -m 模块x -a “模块的参数” 对被管理机器执行不同的操作&#xff0c;只需要调…