LeetCode刷题--- 全排列 II

news2024/9/20 18:53:32

 个人主页:元清加油_【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.coloradmin.cn/o/1322099.html

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

相关文章

【微服务架构】——hystrix基础知识

文章目录 一、Hystrix是什么&#xff1f;二、为什么要使用Hystrix&#xff1f;三、在哪用&#xff1f;什么时候用&#xff1f;四、Hystrix是如何实现自动服务降级和服务熔断的呢&#xff1f; 一、Hystrix是什么&#xff1f; Hystrix是一个用于处理分布式系统的延迟和容错的开源…

智慧安防视频监控可视化平台EasyCVR调用接口返回“Unauthorized”是什么原因?

智慧安防视频监控可视化平台EasyCVR采用了开放式的网络结构&#xff0c;平台能在局域网、公网、专网等复杂的网络环境中&#xff0c;将场景中分散的海量网络监控设备进行统一接入与汇聚管理&#xff0c;并能提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云…

在 Windows PC 上轻松下载并安装 FFmpeg

FFmpeg 是一种开源媒体工具&#xff0c;可用于将任何视频格式转换为您需要的格式。该工具只是命令行&#xff0c;因此它没有图形、可点击的界面。如果您习惯使用常规图形 Windows 程序&#xff0c;安装 FFmpeg 一开始可能看起来很复杂&#xff0c;但不用担心&#xff0c;它;很简…

xhr请求是什么?

1、什么是xhr请求&#xff1f; xhr&#xff0c;全称为XMLHttpRequest&#xff0c;用于与服务器交互数据&#xff0c;是ajax功能实现所依赖的对象&#xff0c;jquery中的ajax就是对 xhr的封装。 XHR&#xff08;XMLHttpRequest&#xff09;请求是一种在浏览器中发送HTTP请求的…

互式流程图|BPMN JointJS+ JavaScript 3.7.3 Crack

JointJS 是 JavaScript 图表库为卓越的 UI 提供支持 使用经过验证的库快速、自信地构建高级视觉和无代码/低代码应用程序。 赋能全球行业领导者 使用 JointJS 构建的图表 一个库&#xff0c;‍无限 UI 选项 直接在您的应用程序中享受交互式流程图、BPMN 和其他图表工作室。利用…

matplotlib科研绘图之折线图、柱状图、散点图、误差棒

matplotlib折线图例子1 # -*- coding: utf-8 -*- # Time : 2023/12/19 10:56 # Author : 长沙有肥鱼 # FileName: 21.py # Software: PyCharm # Blog : https://blog.csdn.net/weixin_53660567?spm1010.2135.3001.5343# 导入Matplotlib库 import matplotlib import ma…

【Vue】el-date-picker日期范围组件(本周、本月、上周)

系列文章 【Vue】vue增加导航标签 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/134965353 【Vue】Element开发笔记 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/133947977 【Vue】vue&#xff0c;在Windows IIS平台…

proxysql读写分离组件部署

一、前言 在mysql一主两从架构的前提下&#xff0c;引入读写分离组件&#xff0c;可以极大的提高mysql性能&#xff0c;proxysql可以在高可用mysql架构发生主从故障时&#xff0c;进行自动的主从读写节点切换&#xff0c;即当mysql其他从节点当选新的主节点时&#xff0c;proxy…

使用yolov8和moviepy自动截取视频中人出现的片段

前言 这么长时间没写博客&#xff0c;其实主要是忙于一个行为实时检测大型项目的开发&#xff0c;最近闲下来就写这篇当年末总结了。这篇文章的起因还是某个业务需求&#xff0c;要求分析视频中有人的部分&#xff0c;没人的部分需要去掉&#xff0c;同时行为检测的数据集如果…

沉浸式数字文旅黑科技!用AI数字人升级景区体验

这年头文旅界也太卷了&#xff01; 在国家文化数字化战略的深入实施下&#xff0c;各地方文旅纷纷打造新型消费场景&#xff0c;以数字文旅提升消费产品的互动性和社交性&#xff0c;增强用户沉浸式体验。 其中&#xff0c;数字人乘着AI大语言模型的东风&#xff0c;被文旅品牌…

SAP 特殊采购类80简介

前面我们已经测试特殊采购类40、70,我们今天测试一下特殊采购类80。 特殊采购类80:在替代工厂生产,在成品层维护特殊采购类,需求和收货在计划工厂完成,成品生产和组件采购在生产工厂完成。 80采购类也是我们在SAP系统中实现跨工厂需求传递的一种方式。它具有传递方式简单、…

破局:国内母婴市场“红利减退”,母婴店如何拓客引流裂变?

破局&#xff1a;国内母婴市场“红利减退”&#xff0c;母婴店如何拓客引流裂变&#xff1f; 背景&#xff1a;中国母婴市场近年来人口出生率一直在恒定范围值&#xff0c;国家也在鼓励优生、多生政策&#xff0c;并且随着互联网的高速发展&#xff0c;人均可支配收入也在增加&…

XC6617 双路输出电容式触摸感应加PWM调光芯片 适用于触摸台灯、触摸调光LED灯

XC6617是一款单路输入双路输出电容式触摸感应PWM调光IC XC6617可在有介质(如玻璃、亚克力、塑料、陶瓷等)隔离保护的情况下实现触摸功能&#xff0c;安全性高。XC6617内置稳压源、上电复位/低压复位及环境自适应算法等多种措施&#xff0c;抗干扰性能优秀。 应用范围:…

程序员应用开发的神器——低代码

一、火热的低代码 低代码的热潮至今未消停&#xff0c;从阿里钉钉跨平台协作方式&#xff0c;再到飞书上的审批流程&#xff0c;以及目前我们接触到的表单审批、投票的模板&#xff0c;这些都是关于低代码的实现方式。 据Gartner最新报告显示&#xff0c;到2023年&#xff0c;超…

微信小程序隐藏返回首页按钮

当用户打开的小程序最底层页面是非首页时&#xff0c;默认展示“返回首页”按钮&#xff0c;开发者可在页面onLoad或者onShow中调用 hideHomeButton 进行隐藏 onLoad(options) {wx.hideHomeButton() }, 官方文档 链接&#xff1a;wx.hideHomeButton(Object object) | 微信开放…

flowable工作流学习笔记

不同版本使用方式不一样&#xff0c;案例使用两个版本6.5.0及6.6.0,学习中6.5.0 版本是独立框架&#xff08;服务单独部署&#xff09;使用的&#xff0c; 6.6.0与springboot集成&#xff0c; 6.5.0版本如下&#xff1a; 下载flowable&#xff1a; https://github.com/flowa…

【ranger】CDP环境 更新 ranger 权限策略会发生低概率丢失权限策略的解决方法

一、问题描述&#xff1a; 我们的 kafka 服务在更新&#xff08;添加&#xff09; ranger 权限时&#xff0c;会有极低的概率导致 MM2 同步服务报错&#xff0c;报错内容 Not Authorized。但是查看 ranger 权限是赋予的&#xff0c;并且很早配置的权限策略也会报错。 相关组件…

有损编码——Wyner-Ziv理论

有损编码是一种在信息传输和存储中常见的编码技术&#xff0c;其主要目标是通过牺牲一定的信息质量&#xff0c;以换取更高的压缩效率。相比于无损编码&#xff0c;有损编码可以在保证一定程度的信息还原的前提下&#xff0c;使用更少的比特数来表示信息。Wyner-Ziv理论是一种重…

类的6个默认成员函数(上)

<center>Efforts of today and tomorrow.<center>今天的努力&#xff0c;明天的实力。开启本文&#xff01; 引入&#xff1a;  如果一个类中森么都没有&#xff0c;那么这个类就是空类&#xff0c;然而空类中真的是什么都没有吗&#xff1f; 其实不然&#xff0c…

第五节 操作符

第五节 操作符 目录 一&#xff0e; 操作符分类二&#xff0e; 算术操作符三&#xff0e; 移位操作符1. 二进制位2. 左移操作符3. 右移操作符 四&#xff0e; 位操作符1. 按位与2. 按位或3. 按位异或 五&#xff0e; 赋值操作符六&#xff0e; 单目操作符1. 概述2. sizeof是操作…