【刷题DAY01】704, 35, 34, 27

704. 二分查找

题目链接:https://leetcode.cn/problems/binary-search/

0x1 看到题目的第一想法

  • 使用二分查找

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

  • 用Python做题有点手生
  • while循环条件一开始写错了,应该是用左右区间下标来进行判断

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

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

  • 二分法看着简单,但是有许多坑,需要注意一下,动手写才知道哪里不会。

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

  • 二分法的使用条件
    • 数组有序
    • 数组中无重复元素
  • 使用二分法
    • 定义targeted查找的区间是左闭右闭或者左闭右开
    • 在整个循环期间都需要保持这个定义的区间不变
  • 左闭右闭 模版
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ##  定义target在[left, right]可以找到
    while(left <= right): # 此处left = right 有意义
    mid = int((left + right) / 2)
    if(nums[mid] < target): # target在右半区间[mid + 1, right]
    left = mid + 1
    elif(nums[mid] > target): # target在左半区间[left, mid + 1]
    right = mid - 1
    else:
    return mid

    return -1
  • 时长
    • 40min

0x6 类似题目

35.搜索插入位置
[34].在排序数组中查找元素的第一个和最后一个位置
0x1 看到题目的第一想法
  • 用三次二分查找,先找target,再找左边界和右边界
0x2 自己实现过程中遇到哪些困难
  • 分析困难
  • if里面不知道填什么
0x4 看完代码随想录之后的想法
  • 充分分析可能出现的所有结果,并进行判断

27. 移除元素

题目链接:https://leetcode.cn/problems/remove-element/

0x1 看到题目的第一想法

  • 删除数组元素,不能使用额外空间
  • 快慢指针

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

  • 大概没有

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

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

  • 在数组、链表中很多时候都会用到这个快慢指针
    • fast走在前面进行查找
    • slow用来指向最终的结果数组
  • 二维循环降到一维的常用方法

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

  • 数组或者链表在很多时候都会有用到快慢指针,会保持数组原来元素的相对位置,时间复杂度和空间复杂度都是O(1)
  • 时长
    • 20min

待重点复习

34

总结

  • 数据结构基础
    • 数组
      • 下标从0开始
      • 内存连续存放
  • 技巧

    • 二分查找

      • 数组有序
      • 时间复杂度 O(logn)
    • 快慢指针

      • 降二维循环为一维
      • 结果数组中的数据保持相对位置
      • 时间复杂度 空间复杂度均为O(1)