LeetCode by python——全排列 II(Permutations II)

ゞ 浴缸里的玫瑰 2022-05-14 13:38 255阅读 0赞

题目:

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

示例:

  1. 输入: [1,1,2]
  2. 输出:
  3. [
  4. [1,1,2],
  5. [1,2,1],
  6. [2,1,1]
  7. ]

思路:

假如你是从开始一题一题做下来的人,这道题应该轻而易举就搞定了。首先说下,这道题和上到全排列有什么不一样:

  • 数字集中有重复数字

说下我们需要注意什么:

  • 数字集是无序的
  • 数字集含有负数

接下来就是将下思路了,有重复的数字,这种类似的题目在前面出现过一些,那么这里我采用的是和前面那些题目一样,记录每个数字的个数,然后遍历无重复数字集合,在每次添加数字到结果集时,都要判断该数字剩余数量是否大于零,添加完后,要对数量进行-1操作。

最后说明一下,不要在结果集那里求set,虽然这样比较简单,但是会超时。

代码:

  1. class Solution:
  2. def permute(self, nums):
  3. """
  4. :type nums: List[int]
  5. :rtype: List[List[int]]
  6. """
  7. if len(nums) == 0:
  8. return []
  9. self.numCnt1 = [0 for i in range(max(nums) + 1)]
  10. self.numCnt2 = []
  11. if min(nums) < 0:#负数另外用一个list存放数字的数量
  12. self.numCnt2 = [0 for i in range(-1*min(nums) + 1)]
  13. self.results = []
  14. self.cnt = len(nums)#存放集合大小
  15. nums1 = []
  16. #去除重复数字
  17. for num in nums:
  18. if num >= 0 and self.numCnt1[int(num)] == 0:
  19. nums1.append(num)
  20. elif num < 0 and self.numCnt2[abs(num)] == 0:
  21. nums1.append(num)
  22. if num >= 0:
  23. self.numCnt1[num] += 1
  24. else:
  25. self.numCnt2[abs(num)] += 1
  26. for index, num in enumerate(nums1):
  27. tempResult = []
  28. tempResult.append(num)
  29. self.numCntMinus(num)
  30. self.helper(nums1, tempResult)
  31. self.numCntPlus(num)
  32. return self.results
  33. def helper(self,nums,tempResult):
  34. tempResult1 = copy.deepcopy(tempResult)
  35. if len(tempResult) == self.cnt:
  36. self.results.append(tempResult1)
  37. else:
  38. for num in nums:
  39. if self.judgeCnt(num) > 0:#判断是否还有该数字
  40. tempResult1.append(num)
  41. self.numCntMinus(num)
  42. self.helper(nums, tempResult1)
  43. self.numCntPlus(num)
  44. tempResult1.pop()
  45. def judgeCnt(self,num):
  46. '''
  47. 判断该数字剩余数量是否大于零
  48. :param num:
  49. :return:
  50. '''
  51. if num >= 0 and self.numCnt1[num] > 0:
  52. return True
  53. elif num < 0 and self.numCnt2[num] > 0:
  54. return True
  55. return False
  56. def numCntPlus(self,num):
  57. '''
  58. 对数字数量进行+1
  59. :param num:
  60. :return:
  61. '''
  62. if num >= 0:
  63. self.numCnt1[num] += 1
  64. else:
  65. self.numCnt2[num] += 1
  66. def numCntMinus(self, num):
  67. """
  68. 对数字数量进行-1
  69. :param num:
  70. :return:
  71. """
  72. if num >= 0:
  73. self.numCnt1[num] -= 1
  74. else:
  75. self.numCnt2[num] -= 1
  76. if __name__ =="__main__":
  77. res = Solution()
  78. print(res.permute([3,3,0,3]))
  79. pass

发表评论

表情:
评论列表 (有 0 条评论,255人围观)

还没有评论,来说两句吧...

相关阅读