0
点赞
收藏
分享

微信扫一扫

【力扣hot100】刷题笔记Day27

前言

  • 关于技巧的题目想不出来直接抄答案好了,都是没遇到的算法可能

136. 只出现一次的数字 - 力扣(LeetCode)

  • 异或操作

    • class Solution:
          def singleNumber(self, nums: List[int]) -> int:
              # 异或运算:
              # 1. a ^ 0 = a
              # 2. a ^ a = 0
              # 3. 满足交换律和结合率
              res = 0
              for num in nums:
                  res = res ^ num  # 把所有的数进行异或,两个的消成0,再和1个的异或得到1个的
              return res

169. 多数元素 - 力扣(LeetCode)

  • 摩尔投票

    • 参考K神题解
    • class Solution:
          def majorityElement(self, nums: List[int]) -> int:
              votes = 0
              for num in nums:
                  # 如果票数为0,则众数在剩下的集合里,重新设置当前数为众数 
                  if votes == 0: x = num   
                  # 和众数相同的票数+1,和众数不同的票数-1       
                  votes += 1 if num == x else -1 
              return x

 75. 颜色分类 - 力扣(LeetCode)

  • 三指针

    • 参考官解视频和讲解人的代码主要是把握循环不变量
    • class Solution:
          def sortColors(self, nums: List[int]) -> None:
              n = len(nums)
              if n < 2: return
              def swap(nums, i, j):
                  nums[i], nums[j] = nums[j], nums[i]
              # 以下区间结合为全区间
              # all in [0, zero) = 0
              # all in [zero, i) = 1
              # all in [two, len - 1] = 2
              # 各指针初始化为空区间
              zero = 0
              i = 0
              two = n
              while i < two:  # 当 i == two 上面的三个子区间正好覆盖了全部数组
                  if nums[i] == 0:        # [0, zero)取不到,先换再加
                      swap(nums, i, zero)
                      i += 1
                      zero += 1
                  elif nums[i] == 2:
                      two -= 1            # [two, len - 1]取得到,先减再换
                      swap(nums, i, two)
                  else:
                      i += 1

 31. 下一个排列 - 力扣(LeetCode)

  • 换数+改升序

    • 思路参考题解
    • class Solution:
          def nextPermutation(self, nums: List[int]) -> None:
              if len(nums) <= 1:
                  return
      
              # 寻找查找第一个相邻升序的元素对(i,i+1),满足A[i]<A[i+1],[i+1,end)为降序
              i = len(nums) - 2
              while i >= 0 and nums[i] >= nums[i + 1]:
                  i -= 1
      
              # 如果i不是 -1,说明找到了相邻升序的元素对(i,i+1)
              if i >= 0:
                  # 在[i+1,end)中寻找第一个大于 nums[i] 的元素的位置k,且k必须在i之后
                  k = len(nums) - 1
                  while nums[i] >= nums[k] and k > i:
                      k -= 1
                  # 交换 nums[i] 和 nums[k]
                  nums[i], nums[k] = nums[k], nums[i]
      
              # 反转从 i+1 到数组末尾的部分,以生成下一个排列
              nums[i+1:] = reversed(nums[i + 1:])

 287. 寻找重复数 - 力扣(LeetCode)

  • 原地哈希

    • 参考K神题解
    • class Solution:
          def findDuplicate(self, nums: List[int]) -> int:
              n = len(nums)
              i = 0
              while i < n:
                  # 如果要放的地方已经被占了,说明找到重复数
                  if nums[i] == nums[nums[i]]:
                      return nums[i]  
                  # 如果没有,就把nums[i]放到下表为nums[i]处,交换
                  else:
                      tmp = nums[i]
                      nums[i], nums[tmp] = nums[tmp], nums[i]
                  # 如果当前位置已放好,i往后移动
                  if i == nums[i]:
                      i += 1
              return -1
  • 环形链表

    • class Solution:
          def findDuplicate(self, nums: List[int]) -> int:
              def next(i):
                  return nums[i]
              slow = fast = 0
              # 第一次相遇
              while True:
                  slow = next(slow)
                  fast = next(next(fast))
                  if slow == fast:
                      break
              slow = 0
              # 第二次相遇
              while slow != fast:
                  slow = next(slow)
                  fast = next(fast)
              return slow

后言

  • Hot100终于刷完了!!(咆哮怒吼兴奋到处爬行),我要找实习!我要上岸!
举报

相关推荐

0 条评论