每天一道算法题:47. 全排列 II

编程入门 行业动态 更新时间:2024-10-28 06:22:54

每天一道<a href=https://www.elefans.com/category/jswz/34/1770096.html style=算法题:47. 全排列 II"/>

每天一道算法题:47. 全排列 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

思路

和 46 题类似但是不能有重复的解,46是数组中的元素各不相,不需要考虑重复元素,直接进行全排列。
47是数组中的元素可能包含重复,为了避免生成重复的全排列,需要在回溯的过程中跳过相邻的重复元素。数组中可能出现重复的数字,但是结果中不能出现重复的解,在处理过程中就要进行去重和剪枝。
首先对 nums 数组进行排序,在递归的过程中,添加了一个额外的集合 position 来跟踪已经选择的元素,并在回溯过程中进行去重的操作。

代码

from typing import Listclass Solution:def subsets(self, nums: List[int]) -> List[List[int]]:# 先排序,让重复的数在一块self.nums = sorted(nums)self.result = []self.length = len(self.nums)self.position = [False] * self.lengthself.backtrack([])return self.resultdef backtrack(self, tmp):if len(tmp) == len(self.nums):self.result.append(tmp[:])returnfor i in range(len(self.nums)):# 当前元素与上一位元素相同,并且上一位元素已经用过了 就跳过, 层 去重复if i > 0 and self.nums[i] == self.nums[i - 1] and self.position[i - 1]:continue# 如果当前的元素已经用过了,就跳过 枝去重if self.position[i]:continuetmp.append(self.nums[i])self.position[i] = Trueself.backtrack(tmp)tmp.pop()self.position[i] = Falseif __name__ == '__main__':nums = [1, 1, 2]s = Solution()s.subsets(nums)

更多推荐

每天一道算法题:47. 全排列 II

本文发布于:2023-11-15 04:50:47,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1593968.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:算法   排列   II

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!