leetcode-47 全排列

leetcode-47 全排列

题目描述:

给定一个可包含重复数字的序列,返回所有不重复的全排列。

使用库函数:

from itertools import permutations
class Solution:
    def permuteUnique(self, nums: List[int]) -> List[List[int]]:
        res = set(permutations(nums,len(nums)))
        return [list(v) for v in res]

先找出所有的组合,再set

from itertools import permutations
class Solution:
    def permuteUnique(self, nums: List[int]) -> List[List[int]]:
        def perm(begin,end,nums):
            if begin == end:
                res.append(nums[:])
            else:
                j = begin
                for i in range(begin,end):
                    nums[i],nums[j] = nums[j],nums[i]
                    perm(begin+1,end,nums)
                    nums[i],nums[j] = nums[j],nums[i]
        res = []
        perm(0,len(nums),nums)
        res = set([tuple(v) for v in res])
        return [list(v) for v in res]

再放入的时候判断,实际上效率更低

from itertools import permutations
class Solution:
    def permuteUnique(self, nums: List[int]) -> List[List[int]]:
        def perm(begin,end,nums):
            if begin == end:
                if nums not in res:
                    res.append(nums[:])
            else:
                j = begin
                for i in range(begin,end):
                    nums[i],nums[j] = nums[j],nums[i]
                    perm(begin+1,end,nums)
                    nums[i],nums[j] = nums[j],nums[i]
        res = []
        perm(0,len(nums),nums)
        return res

解法三

from itertools import permutations
class Solution:
    def permuteUnique(self, nums: List[int]) -> List[List[int]]:
        def perm(nums,tmp):
            if len(nums) == 0:
                res.append(tmp[:])
            for i in range(len(nums)):
                if i > 0 and nums[i] == nums[i-1]:
                    continue
                perm(nums[:i]+nums[i+1:],tmp+[nums[i]])
        res = []
        nums.sort()
        perm(nums,[])
        return res

原文地址:https://www.cnblogs.com/curtisxiao/p/11286033.html

时间: 2024-10-31 12:35:27

leetcode-47 全排列的相关文章

[leetcode] 47. 全排列 II

47. 全排列 II 比上一个题多了个重复性 与46. 全排列完全一样的代码... class Solution { // 当没有下一个排列时return false public boolean nextPermutation(int[] nums) { if (nums.length == 1) { return false; } int p = -1; for (int i = nums.length - 2; i >= 0; i--) { if (nums[i] < nums[i +

LeetCode 47. 全排列 II(Permutations II)

题目描述 给定一个可包含重复数字的序列,返回所有不重复的全排列. 示例: 输入: [1,1,2] 输出: [ [1,1,2], [1,2,1], [2,1,1] ] 解题思路 类似于LeetCode46.全排列,只不过对于每个起始位置维护一个之前遍历过的数集,在交换时判断当前数是否在数集中出现,若出现过则不能交换此数,否则与起始位置交换并将此数加入到数集中. 代码 1 class Solution { 2 public: 3 vector<vector<int>> permuteU

LeetCode 47 全排列II

题目: 给定一个可包含重复数字的序列,返回所有不重复的全排列. 示例: 输入: [1,1,2] 输出: [ [1,1,2], [1,2,1], [2,1,1] ] 解题思路: 与上一题相比,这题多了一个无重复条件.那即在上一题的基础上加上去重处理即可. 去重办法: 首先,为了判别存在重复的数字,我们可以让重复的数字紧靠在一起,这样就可以用 if(nums[i] == nums[i-1]) 这样的方法来判重.那怎么让重复的数字紧靠在一起呢? 使用sort从小到大排序. 然后,使用上述的判重语句,并

LeetCode:全排列II【47】

LeetCode:全排列II[47] 参考自天码营题解:https://www.tianmaying.com/tutorial/LC47 题目描述 给定一个可包含重复数字的序列,返回所有不重复的全排列. 示例: 输入: [1,1,2] 输出: [ [1,1,2], [1,2,1], [2,1,1] ] 题目分析 这道题与上一道全排列I的区别在于,这一次给的序列可以包含重复元素. 1.那此时我们怎么判断当前元素是否使用过呢? 我们使用BitMap(位图)技术建立一个和序列长度相等的布尔数组,记录每

LeetCode:全排列【46】

LeetCode:全排列[46] 题目描述 给定一个没有重复数字的序列,返回其所有可能的全排列. 示例: 输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] 题目分析 首先题目给了一个没有重复数字的序列,它的全排列也一定不含重复数字.我们采用回溯框架法快速解题. 我们就简单思考一个问题,每个排列的第一个元素是如何生成的! 我们从左往右,首先我们将1加入tmpList(临时存储排列的线性表)中,此后再由它

LeetCode 47 Permutations II(全排列)

题目链接: https://leetcode.com/problems/permutations-ii/?tab=Description 给出数组,数组中的元素可能有重复,求出所有的全排列 使用递归算法: 传递参数 List<List<Integer>> list, List<Integer> tempList, int[] nums, boolean[] used 其中list保存最终结果 tempList保存其中一个全排列组合 nums保存初始的数组 used随着计

leetcode 47 包含重复的全排列

思路: 和基础版的全排列很像.关键在于:需要判断同样值的元素在当次递归的for循环中是否已经处理过,如果已经处理过,则忽略.这里选择用map来记录. 1 class Solution { 2 private List<List<Integer>> ans = new ArrayList<>(); 3 public List<List<Integer>> permuteUnique(int[] nums) { 4 ans.clear(); 5 if

[LeetCode] 46. 全排列(回溯)

题目 给定一个没有重复数字的序列,返回其所有可能的全排列. 示例: 输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]] 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/permutations 著作权归领扣网络所有.商业转载请联系官方授权,非商业转载请注明出处. 题解 回溯 使用位掩码数组的方式可以模拟集合拿出放入,以处理int[] num的拿出放入

leetCode 47.Permutations II (排列组合II) 解题思路和方法

Permutations II Given a collection of numbers that might contain duplicates, return all possible unique permutations. For example, [1,1,2] have the following unique permutations: [1,1,2], [1,2,1], and [2,1,1]. 思路:这题相比于上一题,是去除了反复项. 代码上与上题略有区别.详细代码例如以下

leetcode permutations(全排列)

Given a collection of distinct numbers, return all possible permutations. For example,[1,2,3] have the following permutations:[1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], and [3,2,1]. 这其实是一个全排列问题.具有较强的普遍性 一开始自己想了个办法,但是这个办法每次循环都要生成一个ArrayList标记已经访问的位置