【刷题DAY28】491, 46, 49.md

491.递增子序列

题目链接:https://leetcode.cn/problems/non-decreasing-subsequences/

0x1 看到题目的第一想法

0x2 自己实现过程中遇到哪些困难

  • 去重的实现有问题

0x3 今日学习的文章链接,或者视频链接

0x4 看完代码随想录之后的想法

  • 递增子序列(子集问题)
    • 回溯
    • 去重(不可重新排序)
      • 同一树层下 不能遍历重复的节点,要跳过 (我的解法未利用used数组)
    • 注意判断合法之后的跳过是continue不是return

0x5 今日收获,记录一下自己的学习时长

  • 1.5h

46.全排列

题目链接:https://leetcode.cn/problems/permutations/

0x1 看到题目的第一想法

0x2 自己实现过程中遇到哪些困难

0x3 今日学习的文章链接,或者视频链接

0x4 看完代码随想录之后的想法

  • 全排列问题
    • 回溯
    • 不需要startIdx,但是需要记录已经用过的元素
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
      66
      67
      68
      69
      70
      class Solution:
      def permute(self, nums: List[int]) -> List[List[int]]:
      res = []
      path = []

      def backtrack(nums):
      if(len(path) == len(nums)):
      res.append(path[:])

      for i in range(len(nums)):
      if(nums[i] in path):
      continue
      path.append(nums[i])
      backtrack(nums)
      path.pop()

      backtrack(nums)
      return res
      ```

      #### 0x5 今日收获,记录一下自己的学习时长
      - 1h

      ---

      ### 46. 全排列
      题目链接:https://leetcode.cn/problems/permutations/

      #### 0x1 看到题目的第一想法

      #### 0x2 自己实现过程中遇到哪些困难

      #### 0x3 今日学习的文章链接,或者视频链接
      - https://programmercarl.com/0047.%E5%85%A8%E6%8E%92%E5%88%97II.html

      #### 0x4 看完代码随想录之后的想法
      - 全排列问题
      - 回溯
      - 不需要startIdx,但是需要记录已经用过的元素(used数组)
      - 全排列的树层去重多一个判断条件
      ```python
      class Solution:
      def permuteUnique(self, nums: List[int]) -> List[List[int]]:
      path = []
      res = []
      nums.sort()
      # 0 没用过
      used = [0] * len(nums)
      def backtrack(nums):
      # 结束
      if(len(path) == len(nums)):
      res.append(path[:])
      return

      for i in range(len(nums)):
      # 是否已经去过该元素
      if(used[i]):
      continue
      # 去重
      # 同一树层中,不可以再使用重复的元素
      if(i > 0 and not used[i-1] and nums[i] == nums[i-1]):
      continue
      path.append(nums[i])
      used[i] = 1
      backtrack(nums)
      used[i] = 0
      path.pop()

      backtrack(nums)
      return res

0x5 今日收获,记录一下自己的学习时长

  • 1.5h

待重点复习

491, 46, 49

总结

  • 子集问题
    • 递增子序列
    • 不可对数组进行排序来去重,使用used数组进行去重
  • 全排列问题
    • 回溯
    • 全排列不需要startIdx,需要used数组
    • 全排列的树层去重