【刷题DAY07】454, 383, 15, 18.md

454. 四数相加 II

题目链接:https://leetcode.cn/problems/4sum-ii/

0x1 看到题目的第一想法

几个哈希表?

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

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

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

  • 遍历数组12,将和作为key,和出现的次数作为value,放入哈希表中;再遍历数组34,计算是否有满足等于-key的组合出现,如果有count加上value值;最终count即是符合条件的四元祖次数

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

  • 判断一个值是否出现过
    • 哈希表
  • 30min

383. 赎金信

题目链接:https://leetcode.cn/problems/ransom-note/

0x1 看到题目的第一想法

  • 利用数组初始化一个大小为26的哈希表,统计magazine的每个字符出现的次数;遍历ransomNote,每出现一个字符就将对应的value-1;最后遍历哈希表,如果小于0的value,说明不能用magazine构成ransomNote

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

  • No

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

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

  • 一样的解法

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

  • 哈希表
    • 数组
  • 15min

15. 三数之和

题目链接: https://leetcode.cn/problems/3sum/

0x1 看到题目的第一想法

  • 没想法

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

  • python数组排序
    1
    nums.sort()

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

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

  • 用哈希比较复杂,用双指针
    • 使用双指针需要考虑各种情况
  • 首先对数组进行排序。情况1)如果nums[0]>0,不可能存在三元组和为0,直接返回0;情况2)
    1
    2
    3
    4
    5
    6
    a = nums[i] b = nums[left] c = nums[right]
    i in range(n-1)
    对a进行去重,left = i + 1, right = 1
    if(a+b+c>0) 说明大了,right往回缩 right -= 1
    if(a+b+c<0) 说明小了,letf往前进 left += 1
    if(a+b+c=0) 要对b和c进行去重,再双指针同时收缩right -= 1,left += 1

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

  • 求一个数组中所有和为0的三元组,而且元素不能重复

    • 双指针
  • 1h


18. 四数之和

题目链接:https://leetcode.cn/problems/4sum/

0x1 看到题目的第一想法

  • 三指针?

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

  • 注意target为任意值,三数之和的情况1在这里不存在

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

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

  • 在三数之和的for循环里再嵌一个for循环
  • 三数之和时间复杂度 O(n^3) -> O(n^2)
  • 四数之和时间复杂度 O(n^4) -> O(n^3)

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

  • 双指针的使用可以使时间复杂度降低一个数量级

  • 1h


待重点复习

454, 15, 18

总结

  • 哈希表
    • 数组,已知大小
    • set(),未知大小,只有key
    • {},key: value
  • 双指针
    • 三数之和
    • 四数之和