【Leetcode每日一题】 综合练习 - 全排列 II(难度⭐⭐)(71)

1. 题目解析

题目链接:47. 全排列 II

这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了。

2.算法原理

算法思路梳理

为了生成给定数组nums的全排列,同时避免由于重复元素导致的重复排列,我们可以遵循以下步骤和策略:

  1. 预处理与排序
    • 由于题目不要求返回排列的顺序,我们可以首先对nums进行排序,使得所有相同的元素相邻。这样方便后续操作,因为我们可以根据元素的顺序来避免产生重复的全排列。
  2. 定义递归函数
    • 设计一个递归函数backtrack(vector<int>& nums, int idx),其中idx表示当前需要填充的位置。该函数用于搜索并存储所有合理的排列。
  3. 初始化数据结构
    • 使用一个二维数组ans来存储所有可能的排列。
    • 使用一个一维数组perm来保存当前状态下的排列。
    • 使用一个一维数组visited来标记元素是否已经被选择用于当前排列。
  4. 递归过程
    • 递归终止条件:当idx等于nums的长度时,说明已经处理完所有数字,此时将perm数组加入ans
    • 递归状态转移:对于每个下标i,如果nums[i]未被标记(即visited[i]为0),并且如果它之前的相同元素(如果存在)已被标记,则执行以下步骤:
      • 标记visited[i]为1,表示nums[i]已被选择用于当前排列。
      • nums[i]添加到perm数组的末尾。
      • 递归调用backtrack函数,处理下一个位置(即idx+1)。
      • 递归返回后,进行回溯操作:将visited[i]重新设为0,并从perm数组中移除nums[i]
  5. 注意事项
    • 在选择元素时,必须确保相同元素按照它们在排序后数组中的顺序出现在排列中。这样可以确保不会产生重复的全排列。
    • 如果当前元素之前的相同元素未被选择(即未被标记),则当前元素也不能被选择,这同样是为了避免重复排列。
  6. 返回结果
    • 递归完成后,ans数组将包含所有不重复的全排列。

算法实现细节

  • 在递归函数中,需要仔细处理边界条件和状态转移的逻辑,确保每次递归调用都符合题目要求。
  • 使用visited数组可以有效地避免重复选择相同的元素,尤其是在处理含有重复元素的数组时。
  • 回溯操作是深度优先搜索中的重要步骤,它允许我们撤销之前的选择,并尝试其他可能性。

3.代码编写

class Solution {vector<int> path;vector<vector<int>> ret;bool cheak[9];
public:vector<vector<int>> permuteUnique(vector<int>& nums) {sort(nums.begin(), nums.end());dfs(nums, 0);return ret;}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判断!!!if(cheak[i] == true || (i != 0 && nums[i] == nums[i - 1]) && cheak[i - 1] == false){continue;}path.push_back(nums[i]);cheak[i] = true;dfs(nums, pos + 1);path.pop_back();cheak[i] = false;}}
};

The Last

嗯,就是这样啦,文章到这里就结束啦,真心感谢你花时间来读。

觉得有点收获的话,不妨给我点个吧!

如果发现文章有啥漏洞或错误的地方,欢迎私信我或者在评论里提醒一声~

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

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

相关文章

(三)科研技能-非英语母语者英文论文写作注意事项

目录 前言 一、英文写作重要性及文章目的 二、错误及改正方法 1.“a”、“an”、“the” 2.语句过长 3. 先说明目的、地点或原因&#xff0c;为句子的主旨作铺垫 4. 将表示时间的短语放在句首的倾向 5.将最重要的主语放在句首&#xff0c;以示强调 6.“Which”、“Tha…

Web的介绍

什么是web web&#xff1a;全球广域网 &#xff0c;也成为万维网&#xff0c;是通过浏览器访问的网站 web访问的流程 浏览器先对前端服务器&#xff08;前端程序&#xff09;发送请求 然后前端服务器对浏览器进行响应 浏览器对后端服务器&#xff08;Java程序&#xff09;发…

关于YOLO8学习(五)安卓部署ncnn模型--视频检测

前文 关于YOLO8学习(一)环境搭建,官方检测模型部署到手机 关于YOLO8学习(二)数据集收集,处理 关于YOLO8学习(三)训练自定义的数据集 关于YOLO8学习(四)模型转换为ncnn 简介 本文将会讲解: (1)使用前文生成的ncnn模型,部署到安卓端,并且实现视频中,人脸的检测…

02_Java综述

目录 面向对象编程两种范式抽象OOP 三原则封装继承多态多态、封装与继承协同工作 面向对象编程 面向对象编程(Object-Oriented Programming&#xff0c;OOP)在Java中核心地位。几乎所有的Java程序至少在某种程度上都是面向对象的。OOP与java是密不可分的。下面说一下OOP的理论…

【Java探索之旅】内部类 静态、实例、局部、匿名内部类全面解析

文章目录 &#x1f4d1;前言一、内部类1.1 概念1.2 静态内部类1.3 实例内部类1.4 局部内部类1.5 匿名内部类 &#x1f324;️全篇总结 &#x1f4d1;前言 在Java编程中&#xff0c;内部类是一种强大的特性&#xff0c;允许在一个类的内部定义另一个类&#xff0c;从而实现更好的…

SFOS1:开发环境搭建

一、简介 最近在学习sailfish os的应用开发&#xff0c;主要内容是QmlPython。所以&#xff0c;在开发之前需要对开发环境&#xff08;virtualBox官方SDKcmake编译器python&#xff09;进行搭建。值得注意的是&#xff0c;我的开发环境是ubuntu22.04。如果是windows可能大同小异…

Docker-Compose编排LNMP并部署WordPress

前言 随着云计算和容器化技术的快速发展&#xff0c;使用 Docker Compose 编排 LNMP 环境已经成为快速部署 Web 应用程序的一种流行方式。LNMP 环境由 Linux、Nginx、MySQL 和 PHP 组成&#xff0c;为运行 Web 应用提供了稳定的基础。本文将介绍如何通过 Docker Compose 编排 …

Pytorch: nn.Embedding

文章目录 1. 本质2. 用Embedding产生一个10 x 5 的随机词典3. 用这个词典编码两个简单单词4. Embedding的词典是可以学习的5. 例子完整代码 1. 本质 P y t o r c h \mathrm{Pytorch} Pytorch 的 E m b e d d i n g \mathrm{Embedding} Embedding 模块是一个简单的查找表&#…

1.Spring Security介绍

spring security 功能 1.认证authentication&#xff0c;系统认为用户是否登录。 2.授权authorization&#xff0c;判断用户是否有权限去做某些事情。 spring security的缺点是重量级的。 还有另外一个安全认证权限框架是Apache下轻量级权限控制框架Shrio框架。 shiro的缺…

Stable Diffusion Windows部署教程

文章目录 1、准备2、Anaconda安装3、git安装4、开始部署 1、准备 官网需要翻墙软件最少6G内存&#xff0c;显卡在2060以上 2、Anaconda安装 这是一个运行python的环境管理工具进入官网点击download下载打开文件一路到 Advanced Options&#xff0c;勾选第一项注册到环境变量…

C++设计模式-结构型设计模式

写少量的代码来应对未来需求的变化。 单例模式 定义 保证一个类仅有一个实例&#xff0c;并提供一个该实例的全局访问点。——《设计模式》GoF 解决问题 稳定点&#xff1a; 类只有一个实例&#xff0c;提供全局的访问点&#xff08;抽象&#xff09; 变化点&#xff1a…

仿知乎网站问答源码,开源版

仿知乎网站问答源码&#xff0c;开源版 需要一定动手能力 发文章&#xff0c;发视频&#xff0c;发想法&#xff0c;提问回答&#xff0c;注册登录 开发环境 使用技术&#xff1a;springbootthymeleafRedis&#xff1b; 开发环境&#xff1a;tomcat8.0&#xff0c;jdk8.0, ID…

怎么用CAPL与Python交互

怎么用CAPL与其他应用程序交互 怎么用CAPL与Python交互 怎么用CAPL与Python交互 怎么用CAPL与其他应用程序交互前言1、CAPL怎么调Python&#xff1f;1.1CAPL调Python的命令1.2CAPL调用Python实例 2、怎么把python运行的结果返回给CAPL2.1通过环境变量 3、CAPL调Python的输入参…

使用 Docker-Compose 部署 ZooKeeper + Kafka + Kafka-UI

使用 Docker-Compose 部署 Kafka + ZooKeeper 1. 无密码验证部署1.1 启动 ZooKeeper1.2 查看 zookeeper 状态1.3 启动 Kafka1.4 Kafka 配置文件1.4 使用命令操作 Kafak 生产、消费1.4.1 创建topic1.4.2 查看某个 topic1.4.3 获取所有 topic1.4.4 删除 topic1.4.4 发送消息1.4.5…

我们的手机是如何连接上网的?骨干网又是什么?

什么是骨干网&#xff08;Backbone Network&#xff09; 几台计算机连接起来&#xff0c;互相可以看到其他人的文件&#xff0c;这叫局域网。整个城市的计算机都连接起来&#xff0c;就是城域网。把城市之间连接起来的网就叫骨干网。 这些骨干网是国家批准的可以直接和国外连…

环形列表 题目分析

一、题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 二、思路 1.使用快慢指针&#xff0c;快指针一次走两步&#xff0c;慢指针一次走一步&#xff0c;二者相对速度为1 2.当慢指针刚好进入环时&#xff0c;设二者的相对距离为N 3.如果链表中存在环&#xff…

Colab - Introduction to Object Detection using TensorFlow Hub

Colab - Introduction to Object Detection using TensorFlow Hub 1. 源由2. TensorFlow Hub3. 目标检测3.1 举例 - EfficientDet/D4 COCO 20173.2 下载示例图像3.2.1 显示部分样本3.2.2 定义一个将类别ID映射到类别名称和颜色的字典 3.3 加载模型3.4 单张照片执行推理3.4.1 推…

Python基础详解一

一&#xff0c;print打印 print("hello word") print(hello word) 双引号和单引号都可以 二&#xff0c;数据类型 Python中常用的有6种值的类型 输出类型信息 print(type(11)) print(type("22")) print(type(22.2)) <class int> <class str&…

C#图像:2.图像处理

类库项目ImageProcessingLibrary代码 里面是几种图像处理函数&#xff0c;可以生成DLL文件被其他&#xff08;下面&#xff09;项目添加引用 using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.…

IoTDB 入门教程——导读

文章目录 一、基础篇二、实战篇三、企业篇四、问题篇 Apache IoTDB&#xff08;物联网数据库&#xff09;是一体化收集、存储、管理与分析物联网时序数据的软件系统。 Apache IoTDB 采用轻量式架构&#xff0c;具有高性能和丰富的功能&#xff0c;并与Apache Hadoop、Spark和Fl…