每日leetcode--全排列II

问题描述

题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

给定一个可能包含重复元素的整数数组 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]]

解题思路: 回溯  剪枝

这个问题可以使用回溯算法来解决。回溯算法是一种通过穷举所有可能情况来找到所有解的算法。在这个问题中,我们需要通过回溯来生成所有可能的排列,并且在生成排列的过程中,需要保证排列中不存在重复元素。

具体实现时,可以定义一个递归函数 backtrace() 来进行回溯。该函数接受五个参数:

  • res: 用于存储所有不重复的排列
  • nums: 给定的整数数组
  • check: 标记数组,用于记录每个元素是否已经使用过
  • element: 当前正在生成的排列
  • depth: 当前正在考虑的元素的下标

在递归函数 backtrace() 中,我们首先判断当前排列是否已经包含了所有的元素。如果是,就将当前排列添加到结果列表 res 中,然后返回。

如果当前排列还没有包含所有的元素,就从给定的整数数组 nums 中选择一个未使用过的元素,并将其添加到当前排列 element 中。接着,我们递归调用 backtrace() 函数,继续向后生成排列。当递归返回时,我们需要将当前加入的元素从排列中删除,并将其标记为未使用过,以便后续的排列生成。

在生成排列的过程中,我们需要注意避免重复排列的情况。具体来说,如果当前元素和前一个元素相同,并且前一个元素还没有被使用过,就应该跳过当前元素,以避免生成重复排列。

最后,我们调用 backtrace() 函数,将结果列表 res 返回即可。

代码实现

下面是 Python 代码实现。其中,backtrace() 函数就是上述的递归函数,它通过检查当前元素是否和前一个相同来避免重复排列的情况。

class Solution:def permuteUnique(self, nums: List[int]) -> List[List[int]]:nums.sort()res = []element = []check = [0 for _ in range(len(nums))]depth = 0def backtrace(res, nums, check,element, depth):if depth == len(nums):res.append(element[:])returnfor i in range(len(nums)):if check[i] == 0:# 防止重复:if i >0 and nums[i] == nums[i-1] and check[i-1] == 0:continuecheck[i] = 1element.append(nums[i])backtrace(res, nums, check, element, depth+1)check[i] = 0element.pop()backtrace(res, nums, check, element, depth)return res

总结

「全排列 II」问题是一道经典的回溯算法问题。在解决这个问题的过程中,我们需要通过回溯来生成所有可能的排列,并且在生成排列的过程中,需要保证排列中不存在重复元素。具体实现时,可以定义一个递归函数 backtrace() 来进行回溯,并通过检查当前元素是否和前一个相同来避免重复排列的情况。

                                                                            回溯问题三要素:
#### 有效结果

if len(sol) == len(nums):


         
#### 回溯范围及答案更新

 check[i] = 1element.append(nums[i])backtrace(res, nums, check, element, depth+1)check[i] = 0element.pop()


#### 剪枝条件
 

if check[i] == 1:continue
if i > 0 and nums[i] == nums[i-1] and check[i-1] == 0:continue

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

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

相关文章

vue3 globalData 的使用方法

直接上教程 .新创建一个data.js它可以和main.js平级也可以在store文件夹下面都行,无非就是引用的时候前缀多一个单词少一个单词这样 data.js: 从vue上面引入reactive ,然后它可以创建一个也可以创建两个可以任意名称 A或B或C都可以 //data.js import…

SpringMVC 学习(一)之 SpringMVC 介绍

目录 1 MVC 介绍 2 SpringMVC 介绍 2.1 SpringMVC 特点 2.2 SpringMVC 的核心组件 2.3 SpringMVC 执行流程 3 参考文档 1 MVC 介绍 MVC (Model View Controller) 是一种设计思想,它将应用程序分为三大组件:模型 (Model)、视图 (View)、控制器 (Con…

用TensorRT-LLM跑通chatGLM_6B模型

零、参考资料 NVIDIA官网 THUDM的Github NVIDIA的Github 一、构建 TensorRT-LLM的docker镜像 git lfs install git clone https://github.com/NVIDIA/TensorRT-LLM.git cd TensorRT-LLM git submodule update --init --recursive sudo make -C docker release_build sudo m…

在openEuler中通过KVM可视化安装华为FusionCompute的VRM节点

一、说明 本文是华为FusionCompute云平台配置的延续,是在CNA(ComputingNode Agent,计算节点代理)主机安装配置完成后,详细安装VRM(Virtual Resource Manager,虚拟资源管理器)节点的…

「JavaSE」String类3:字符串常量池

🎇个人主页:Ice_Sugar_7 🎇所属专栏:快来卷Java啦 🎇欢迎点赞收藏加关注哦! 字符串常量池 🍉常量池🍉字符串常量池🍉intern 方法 🍉常量池 在Java程序中&…

微服务-Alibaba微服务nacos实战

1. Nacos配置中心 1.1 微服务为什么需要配置中心 在微服务架构中,当系统从一个单体应用,被拆分成分布式系统上一个个服务节点后,配置文件也必须跟着迁移(分割),这样配置就分散了,不仅如此&…

*MYSQL--索引--内部原理

MYSQL的索引根据功能,主要有三大类型: 1.HASH索引 2.二叉树 3.BTREE索引 一:HASH索引 1.内部原理: 在设置了某列为索引列之后,并且开始或者将要在相应索引列创建数据的时候,系统通过某种算法 F(X) 自动计算出来一个十六进制的哈希值,这个哈希值能够对应相应的字段值 所以…

数据之巅:揭秘企业数据分析师如何成为企业的决策智囊

引言 在数字化浪潮中,企业数据分析师已成为企业决策的重要支撑。他们如同探险家,在数据的丛林中寻找着能够指引企业前行的宝贵信息。本文将深入剖析企业数据分析师的角色、挑战与成就,带你领略这个充满智慧与激情的职业风采。 一、从数字到智…

28-k8s集群中-StatefulSets控制器(进阶知识)

一、statefullsets控制器概述 1,举例 假如,我们有一个deployment资源,创建了3个nginx的副本,对于nginx来讲,它是不区分启动或者关闭的先后顺序的,也就是“没有特殊状态”的一个服务,也成“无状…

【Java】图形、图像与音频(实验十二)

一 、Component组件类中有一个public void paint( Graphics g)绘画方法,只要用户自定义的类继承了此组件类或其子类并重写了paint()方法,当用户自定义的类被实例化后,此时java运行环境就会开启一个新线程来自动调用并执行用户自定义类中的pai…

树莓派更新源,以及安装wiringPi库

1、更换树莓派(Raspberry Pi 3B)软件源 更换树莓派(Raspberry Pi 3B)软件源为国内镜像源_树莓派3b更换国内源-CSDN博客 2、安装wiringPi库 安装wiringPi库在树莓派上,可以按照以下步骤进行操作: a.首先&…

十四届蓝桥杯国赛考试计算思维 U10 组真题和答案

答案在底部 第一题 恐龙乐园的规划图中有 n 个小岛,m 座小桥,每座桥连接两个小岛。 下图是 n=5,m=8 的一个例子: 希希发现,如果拆除一些桥,仍然能使任何两个小岛都互通。最多可以拆除( )座 桥。 A. n-m B. m-n C. m-m-1 D. m-n+1 第二题

Python文件和异常(一)

目录 一、从文件中读取数据 (一)读取整个文件 (二)文件路径 (三)逐行读取 (四)创建一个包含文件各行内容的列表 (五)使用文件的内容 (六&a…

私域运营的4个核心要素

第一,我们要首先理解私域现在的形势。 以前私域:崛起的微商。发朋友圈,成交率高。 因为主要来源是信息差。 当代:信息透明化。私域流量运营的本质是获取信任。通过建立起泛人脉亲密关系。信任才重要。 第二,塑造一对一…

探索设计模式的魅力:状态模式揭秘-如何优雅地处理复杂状态转换

​🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》 💪🏻 制定明确可量化的目标,并且坚持默默的做事。 探索设计模式的魅力:状态模式揭秘-如何优雅地处理复杂状态转换 文章目录 一、案例…

VUE3使用three.js显示3D模型

使用3D模型作为自动化系统的界面已经成为潮流。尽管在AutomationML 中推荐COLLADA作为 3D 模型的标准。但是COLLADA的开发者khronos 集团却已经开发了COLLADA的后继者glTF 。glTF 2.0已经成为国际标准ISO/IEC 12113:2022。 Khronos声称-‘glTF是3D里的JPEG’。目前看来glTF 更加…

Java WEB面试系列-01

1. 什么是 Servlet? Servlet是用Java编写的服务器端程序, 其主要功能在于交互式地浏览和修改数据,生成动态Web内容。 狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,我们一般将Servlet理解为后者。 2. 为什么要使…

问题慢慢解决-通过android emulator调试android kernel-内核条件断点遇到的问题和临时解决方案

起因 在摸索到这个方案之后,mac m1调试aarch64 android kernel最终方案,就准备调试内核了,预备下断点的地方是 b binder_poll b ep_ptable_queue_proc b remove_wait_queue但是由于是android系统,上面三个函数会被频繁的触发&am…

ERC721解读

NFT(非同质化代币):类似于明朝、宋朝的青花瓷。虽然都是青花瓷。但是都具有唯一的典藏价值。而且价值可能不同。 NFT就是具有唯一价值的代币。 ERC721: 是以太坊规定实现NFT的一种标准了。实现ERC21标准的智能合约就是NFT代币了。 1.接口 1.ERC721 定义接口参考:ER…

vue.js中slot插槽的作用

作为一种流行的JavaScript框架,vue.js提供了很多功能强大的特性,其中之一就是插槽(slot)。插槽是一种能够让父组件向子组件传递内容的机制,它为我们构建可复用的组件提供了更大的灵活性和可扩展性。以下介绍Vue中插槽的…