leetcode47. 全排列 II有重复元素的全排列,深度优先搜索

news2024/9/20 11:15:15

leetcode47. 全排列 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

在这里插入图片描述

目录

    • leetcode47. 全排列 II/有重复元素的全排列
    • 题目分析
    • 算法步骤
    • 算法步骤中的跳过重复元素逻辑
    • 算法流程
    • 具体代码
    • 算法分析
    • 相似题目

题目分析

给定一个整数数组 nums,返回所有可能的全排列,但要求排列中不包含重复的元素。这个问题可以通过深度优先搜索(DFS)和排序来解决。

算法步骤

  1. 初始化一个结果数组 res 和一个临时数组 temp
  2. 调用 dfs 函数进行深度优先搜索。
  3. dfs 函数的参数包括数组 nums 的长度 n,当前已经选择的元素数量 t,数组 nums,以及一个布尔类型的数组 used,用于记录元素是否已经被使用。
  4. 如果 t 等于 n,说明已经选择了所有元素,将 temp 添加到 res
  5. 否则,遍历 nums 中的每个元素:
    • 如果该元素已经被使用,则跳过。
    • 如果该元素没有被使用,则将其添加到 temp,标记为已使用,然后递归调用 dfs
    • 回溯时,从 temp 中移除该元素,并将其标记为未使用。
  6. 在每次递归调用前,对 nums 进行排序,以确保生成的排列是唯一的。
  7. 返回 res

算法步骤中的跳过重复元素逻辑

dfs 函数中,当遍历到数组中的某个元素 num[i] 时,如果满足以下条件,则跳过该元素:

  1. i > 0:确保我们比较的是当前元素与其前一个元素。
  2. num[i - 1] == num[i]:当前元素与前一个元素的值相同。
  3. !used[i - 1]:前一个元素没有被使用过。

当这三个条件同时满足时,说明如果选择了当前元素,将会生成一个与之前已经生成的排列重复的排列。为了避免这种情况,我们选择跳过当前元素,继续遍历数组中的下一个元素。

算法流程

深度优先搜索
函数dfs
参数: n, t, nums, used
选择一个元素
是否使用过
结束
使用该元素
递归dfs
回溯
标记元素为未使用
结束

具体代码

class Solution {
public:
    vector<vector<int>> res;
    vector<int> temp;
    void dfs(int n,int t,vector<int> &num,vector<bool> &used)
    {
        if(t==n)
        {
            res.push_back(temp);
            return ;
        }
        for(int i=0;i<n;i++)
        {
            if(!used[i])
            {
                 if (i > 0 && num[i - 1] == num[i] && !used[i - 1]) continue;
                used[i]=true;
                temp.push_back(num[i]);
                dfs(n,t+1,num,used);
                temp.pop_back();
                used[i]=false;
            }
        }
    }
    vector<vector<int>> permuteUnique(vector<int>& num) {
    if(num.size()==0) return res;
    vector<bool> used(num.size(),false);
    sort(num.begin(), num.end());
    dfs(num.size(),0,num,used);
    return res;
    }
};

算法分析

  • 时间复杂度: O(n!),因为需要生成所有可能的全排列。但由于数组中不允许重复元素,实际的时间复杂度会小于 O(n!)。
  • 空间复杂度: O(n),由于递归调用栈和临时数组的使用。
  • 易错点: 在递归过程中需要正确处理回溯,确保每个元素只被使用一次。同时,需要处理数组中重复元素的情况,以避免生成重复的排列。排序操作可以保证在同一位置上的元素不会重复使用。

相似题目

题目链接
46. 全排列https://leetcode.cn/problems/permutations/
47. 全排列 IIhttps://leetcode.cn/problems/permutations-ii/
77. 组合https://leetcode.cn/problems/combinations/

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

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

相关文章

【数据结构4】树的实例-模拟文件系统、二叉树的遍历(先序遍历、中序遍历、后序遍历、层次遍历)

1 树和二叉树 2 树的实例-模拟文件系统 3 二叉树 3.1 二叉树的遍历 二叉树的先序遍历 二叉树的中序遍历 二叉树的后序遍历 二叉树的层次遍历 1 树 树是一种数据结构 比如:目录结构 树是一种可以递归定义的数据结构树是由n个节点组成的集合:如果n0&#xff0c;那这是一棵空树;如…

测试用例(还需要输入1个字)

近期机缘巧合&#xff0c;连续写2个项目的测试用例。第一个项目&#xff0c;纯属没有办法&#xff0c;参与该项目的现在就只剩我一个人了&#xff0c;只能自己写了&#xff0c;这不&#xff0c;我专门跑到客户那啥都不干&#xff0c;写文档写了2天&#xff1b;第二个项目&#…

如何使用gewe开发微信机器人

本文介绍了如何利用GeWe框架开发一个功能丰富的微信智能机器人。GeWe是一个开发协议&#xff0c;为微信机器人提供了强大的功能支持&#xff0c;包括关键字回复、自动通过好友和自动发朋友圈等特性。我们将通过一个简单的示例演示如何在GeWe框架下实现这些功能&#xff0c;并附…

模型 空雨伞

列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。观察现状&#xff0c;分析原因&#xff0c;制定行动。 1 空雨伞模型的应用 1.1 空雨伞模型应用之API对接的决策 某公司产品经理A君接到了与合作方对接API的任务。合作方对公司的中台API有特定的需求&…

有什么办法能恢复郎科u盘的数据?常用方法分享

在数字化时代&#xff0c;数据已成为我们生活与工作中不可或缺的一部分。郎科U盘&#xff0c;以其便携、稳定的特性&#xff0c;成为了许多人存储重要文件的首选。然而&#xff0c;面对突如其来的数据丢失&#xff0c;无论是误删、格式化还是病毒侵袭等&#xff0c;都足以让人心…

【Qt】常见控件 —— QWidget(上)

文章目录 QWidget 的基本介绍QWidget 的 enable 属性QWidget 的 geometry属性QWidget 的 windowTitle属性 QWidget 的基本介绍 Qt 中 的 各种控件 都继承自 QWidget类 在 Qt designer 右侧 就显示出 QWidget的各种属性 并且也可以直接进行编辑 QWidget 的 enable 属性 enable…

ETAS工具链自动化实战指南<二>

----自动化不仅是一种技术&#xff0c;更是一种思维方式&#xff0c;它将帮助我们在快节奏的工作环境中保持领先&#xff01; 目录 往期推荐 RTA-A2L工具概览 RTA-A2L的输出文件 常用命令行参数 场景1&#xff1a;通过 MCSD 文件来生成 .a2l 文件并更新地址 命令用法 命…

getchar(),putchar(),EOF的详细解释

文章目录 getchar(),putchar(),EOF的意义和作用一、相关函数putchar( )getchar&#xff08;&#xff09; 二、EOF 的值三、总结 getchar(),putchar(),EOF的意义和作用 在 C 语言中&#xff0c;EOF 是 End Of File 的缩写&#xff0c;即文件结束标志。 在读取文件时&#xff0…

趣味算法------饮料换购

目录 题目描述&#xff1a; 解题思路&#xff1a; 具体代码&#xff1a; C语言版本&#xff1a; python版本&#xff1a; 题目描述&#xff1a; 乐羊羊饮料厂正在举办一次促销优惠活动。乐羊羊C型饮料&#xff0c;凭3个瓶盖可以再换一瓶C型饮料&#xff0c;并且可以…

SCI论文系统各阶段状态含义,一文带你全面掌握!告别投稿小白!

知识小站 SCI&#xff08;Science Citation Index&#xff0c;科学引文索引&#xff09;是由美国科学信息研究所&#xff08;Institute for Scientific Information, ISI&#xff09;创建的一个引文数据库。它收录了全球各学科领域中最具影响力的学术期刊&#xff0c;涵盖自然…

尝试给OpenHarmony4.0增加可以在动态库中使用的日志模块

尝试给OpenHarmony4.0增加可以在动态库中使用的日志模块 前言一、资源来源二、实践步骤1.修改OH内核并编译2.动态库增加welog打印3.设备验证打完收工 总结参考 前言 最近在搞OpenHarmony4.0蓝牙模块的适配&#xff0c;最主要的工作就是在libbt_vendor.z.so这个库的编写修改&am…

文件找回用哪个数据恢复软件好?最佳文件恢复软件值得拥有!

在如今数字化的时代&#xff0c;文件已经成为我们工作和生活中不可或缺的重要组成部分。然而&#xff0c;由于各种意外情况&#xff0c;如误删除、系统故障、病毒攻击或存储设备损坏等&#xff0c;文件丢失的情况时有发生。当这种情况发生时&#xff0c;一款出色的数据恢复软件…

解锁SQL的无限可能 | 且看如何秒解墨天轮SQL挑战赛第二期题目

目 录 墨天轮SQL挑战赛第二期 比赛题目 数据准备 解题过程 方法1: 优雅的解法 | last_value分析函数忽略NULL值特性实现 方法2: 通用的解法 | 断点分组思想 小结 Sql进阶技巧&#xff1a; 如何分析商品入库采购成本数据缺失问题&#xff1f;| 近距离有效的数据缺失值…

jvm 调优篇

一 jvm调优篇 1.1 查看新生代和老年代的比例 输入命令&#xff1a; jinfo -flag NewRatio 17480 1.2 查看新生代&#xff0c;survivor和Eden区比例 1.3 查看jvm调优参数 二 调优参数 2.1 oom异常 通过visual vm查看 2.java dump 大对象 2.2 mat工具进行分析 栈的信息

生物信息学数据分析服务

常见个性化分析列表 GEO相关服务 1&#xff0c;芯片数据挖掘。根据芯片类型&#xff0c;计算表达谱&#xff0c;差异基因等 2&#xff0c;高通量测序数据挖掘。根据测序类型&#xff0c;计算表达谱&#xff0c;差异或者peak calling等 3&#xff0c;多组学数据联合分析 4&…

2024年测试岗最新自动化测试面试题整理,干货满满

前言 本文由作者本人根据2024年测试岗最新面试整理所得&#xff01;内容是很干货的&#xff01;对我也很有帮助。本文仅做个分享~ 一、接口测试 1、接口测试用例的编写要点有哪些&#xff1f;&#xff08;问法二&#xff1a;接口测试用例设计需要考虑哪些方面&#xff1f;问法…

AList嵌入动态验证码实现动态校验

前言 晓杰利用ALists创建了个网盘资源站&#xff0c;想着如何增加个动态验证码进行验证后才能进行访问下载&#xff0c;刚开始利用了固定的验证码&#xff0c;用户可以通过JS代码中进行绕过或直接拿到验证码&#xff0c;经过晓杰多次优化&#xff0c;最终版本支持动态获取验证…

大模型之LangChain介绍

1、LangChain介绍 LangChain 就是一个 LLM 编程框架&#xff0c;你想开发一个基于 LLM 应用&#xff0c;需要什么组件它都有&#xff0c;直接使用就行&#xff1b;甚至针对常规的应用流程&#xff0c;它利用链(LangChain中Chain的由来)这个概念已经内置标准化方案了。下面我们…

使用ftl文件导出时,多层嵌套循环

核心点 //针对集合1进行循环 <#list priceDetail as pd>//对集合1中包含的集合2进行存在和判空 判断<#if pd.detail ?exists && pd.detail ?size!0> //对集合2进行循环<#list pd.detail as d>...</#list></#if></#list> 模版…

kafka发送消息-自定义消息发送的拦截器

1、自定义拦截器 创建自定义拦截器类&#xff0c;实现ProducerInterceptor接口。对消息进行拦截&#xff0c;可以在拦截中对消息做些处理&#xff0c;记录日志等操作… package com.power.config;import org.apache.kafka.clients.producer.ProducerInterceptor; import org…