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.全排列没做的,建议先做那道题。

可以在那道题的基础上进行修改。

首先在那道题的基础上,我们可以得到这个数组所有的排列,但数组中可能有重复元素,也就会产生重复的排列,如例1:[1,1,2],以第一个为首,能得到的排列是[1,1,2]和[1,2,1],但以第二个1为首得到的排列也是[1,1,2]和[1,2,1],所以相同数字为首,我们只需要用一个获取全排列即可。

故在那道题的代码基础上,给每一层添加一个isUsed,因此在for循环里的条件变成if used[i] == 1 or nums[i] in isUsed:    continue,前半部分used[i] == 1是为了得到全排列,后半部分nums[i] in isUsed是去除重复数字带来的重复全排列影响。

46.全排列题解:46. 全排列-CSDN博客

代码(Python):

class Solution(object):
    def permuteUnique(self, nums):
        result = []
        path = []
        used = [0] * len(nums)
        def backtracking(used):
            if len(path) == len(nums):
                result.append(path[:])
                return
            isUsed = set()
            for i in range(0,len(nums)):
                if used[i] == 1 or nums[i] in isUsed:    #去重
                    continue
                used[i] = 1
                isUsed.add(nums[i])                  #已经使用过的数字放入isUsed,防止重复数字影响
                path.append(nums[i])
                backtracking(used)
                path.pop()
                used[i] = 0
        backtracking(used)
        return result
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值