题解 | #有重复项数字的全排列#

有重复项数字的全排列

http://www.nowcoder.com/practice/a43a2b986ef34843ac4fdd9159b69863

这个链接中是解决没有重复项数字的全排列的思路。此时我的总体递归思想是,取出第一个数字,递归得到剩下list的全排列,然后把第一个数字插入到结果的每一个位置。这样一种递归思想确实能得到全排列,但是当有重复数字时,很难将结果按照字典顺序返回。因为这种递归思想中对于重复数字的解决办法是得到递归结果,然后把递归结果中重复的删除,这样确实可以得到没有重复的结果,但是确不是完全按照字典升序排列的,比如[-1,0,3,3],再把-1作为开头数字时,返回的全排列是[0,3,3],[3,0,3],[3,3,0],把-1插入时[3,0,3,-1]是在[3,-1,3,0]前面,也就造成问题了。

因此需要换一种递归思路,每次递归时,先遍历每个数字,依次把该数字放在开头,然后得到剩余list的全排列,在拼接即可。如果遇到数字和它后面一个数字相同时,就直接pass即可,这样一种递归也就直接解决了重复数字问题,因此顺序不会出bug。具体算法流程如下:

  1. 按照顺序排列list;
  2. 遍历list,取出a=list[i],如果a=list[i+1],那么不递归,否则就递归获取剩余list序列的全排列,把a放在开头拼接即可。

注意一下边界条件就没问题了。

#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param num int整型一维数组 
# @return int整型二维数组
#
class Solution:
    def permuteUnique(self , num) :
        # write code here
        if len(num)==1:
            return [num]
        num.sort()
        new_result = []
        for i in range(len(num)-1):
            a = num[i]
            if a == num[i+1]:
                pass
            else:
                result = self.permuteUnique(num[:i]+num[i+1:])
                for j in range(len(result)):
                    new_result.append([a]+result[j])
        a = num[-1]
        result = self.permuteUnique(num[:-1])
        for j in range(len(result)):
            new_result.append([a]+result[j])
        return new_result



num = [-1,3,0,3]
print(Solution().permuteUnique(num))

全部评论

相关推荐

Twilight_m...:经典我朋友XXXX起手,这是那种经典的不知道目前行情搁那儿胡编乱造瞎指导的中年人,不用理这种**
点赞 评论 收藏
分享
Java抽象带篮子:简历怎么写可以看看我发的帖子,你的第一个是实习经历吗?那怎么写的是你的第一个练手项目呢?简历写的怎么样直接投小厂面试一下就知道了
没有实习经历,还有机会进...
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
06-29 17:30
找实习找着找着就要进入7月了,马上秋招也要开始了,找实习还有意义吗?
绝迹的星:有面就面, 没面上就当日薪4位数大佬免费培训, 面上了再考虑要不要实习
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务