• Leetcode_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

    思路:

    在Leetcode_46题目上进行修改

    ①首先要排序,排序过后相同的数字是相邻的,相邻数字之间比较容易比较

    ②如果nums[i-1]和nums[i]相同,并且visited[i-1]为false,则说明存在重复,跳过即可

    代码:

    1. class Solution(object):
    2. def permuteUnique(self, nums):
    3. if not nums:
    4. return []
    5. # visited初始化为False
    6. visited = [False] * len(nums)
    7. res = []
    8. # 排序,后续根据相邻数字之间的关系来判断是否重复
    9. nums.sort()
    10. def dfs(res, visited, road, deep):
    11. # 递归边界
    12. if deep == len(nums):
    13. res.append(road[:])
    14. for i in range(len(nums)):
    15. # i > 0 是因为防止i-1出错;nums[i - 1] == nums[i]表示相邻重复;visited[i - 1]表示的是访问i位置时,
    16. # 如果i-1位置没有被访问过,也不需要访问,因为是重复的数字
    17. if i > 0 and nums[i - 1] == nums[i] and not visited[i - 1]:
    18. continue
    19. if not visited[i]:
    20. visited[i] = True
    21. road.append(nums[i])
    22. dfs(res, visited, road, deep + 1)
    23. road.pop()
    24. visited[i] = False
    25. dfs(res, visited, [], 0)
    26. return res
    27. if __name__ == "__main__":
    28. nums = [1, 1, 3]
    29. a = Solution()
    30. res = a.permuteUnique(nums)
    31. print(res)

  • 相关阅读:
    [SQL]视图和权限
    SpringCloud Sleuth 分布式请求链路追踪
    Ansible简介-安装
    Java项目生成电脑桌面快捷脚本
    【重识云原生】第六章容器6.1.8节——Docker核心技术UnionFS
    AI项目十二:PaddleOCR环境搭建及测试
    Kubernetes Pod配置:从基础到高级实战技巧
    NIO中ByteBuffer
    83.Django项目中使用验证码
    【无标题】
  • 原文地址:https://blog.csdn.net/AnakinCSDN/article/details/134418663