代码随想录算法训练营第一天 | 704. 二分查找,27. 移除元素

数组理论基础

[LeetCode 704] 二分查找

[LeetCode 704] 二分查找讲解文章
[LeetCode 704] 二分查找讲解视频

自己看到题目的第一想法

    经典的二分查找, 应该是比较简单的. 首先计算出中间索引, 根据计算出的中间索引获取到对应下标的值, 根据该值与目标值的大小左比较, 得到目标值所处于的更小的区间. 重复该步骤最终将目标锁定再[n, n]或者[n, n + 1)的范围内. 这是非常简单的算法题了, 很轻松就可以实现.

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

    漏了一些前置条件的思考: 首先二分法查找唯一元素是需要有条件的, 第一数组是排好序的, 第二数组中的数字是唯一的.

    一个算法竟然有多种实现细节, 这个人竟然搞明白了, 真厉害啊.

    看似简单的算法, 看起来懂得和真正实现一次就 AC 是有差距的. 比如文章讲解中就指出, 当使用 leftIndex 和 rightIndex 来不断逼近目标索引的时候, 每次 leftIndex 和 rightIndex 与 middleIndex 的关系, 到底是 +1, 还是 -1, 还是直接等于. 当看到这个的时候, 我第一反应是, 这个是需要先思考好的吗? 第二反应是, 难道不要先想清楚想明白吗, 没想明白的话编码的时候不就一团雾水, 导致要不断的 debug 么. 同时没想好也说明对算法的掌握程度比较低. 于是默默的沉默了, 怀疑起自己的能力来...

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

    果然在实现的过程中, 不出意外的出现了死循环的意外. 原因在于 [leftIndex, rightIndex) 这种实现方式的时候, leftIndex 想当然的和 rightIndex 一样, leftIndex = middleIndex. 然而这时候因为 leftIndex 需要排除已知错误的值, 因此应该是 leftIndex = middleIndex + 1. 当然这样的错误通过日志是很容易查找的. 只是如果真的理解算法, 一步一步实现, 不要简单的 cv 的话, 不应该出现这样的错误.

[LeetCode 27] 移除元素

[LeetCode 27] 移除元素讲解文章

[LeetCode 27] 移除元素讲解视频

自己看到题目的第一想法

    从头开始遍历, 遇到需要移除的元素, 就将该元素之后的所有元素向前挪一位. 最坏的情况就是每一位都需要移动, 这时候时间复杂度为 o(N^2).

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

    快慢指针是什么?

        快指针是用来遍历所有元素的.

        慢指针指向的是结果数组的无内容的索引位置, 发现一个不需要剔除的元素, 就将对应的元素复制到索引对应的位置, 同时将慢指针前移一位.

    好像以前看过, 又好像没有. 然而依旧觉得惊为天人, 真是个天才的想法.

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

    好像没有.


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

    大概从中午11点开始, 陆陆续续学到下午2点. 还完成了拓展练习中的[LeetCode 34] 在排序数组中查找元素的第一个和最后一个位置 [LeetCode 35] 搜索插入位置 . 期间还有分心和吃饭的时间, 实际学习用大概2.5个小时左右.

    本质上说, 二分法查找也是双指针的思想. 难点就在于每一次缩小区间时, 区间的边界在哪里. 而移除元素也是双指针的思想, 一开始总觉得很疑惑, 数组的内容不断被修改, 似乎特别的混乱. 然而当想明白 slowIndex 和 fastIndex 第一次分离的时候, slowIndex 所指向的空间便是被释放的空间了, 而剩余所有能添加到指定空间的数量, 也小于 slowIndex 所拥有的空间数量. 因此元素都将被有序的前置, 同时少了一次 for 循环移动数据, 大大的提高了算法的性能. 因此, 说算法不重要的自己, 确实是眼界太低. 好的算法可以提高程序的性能, 扎实的算法可以提高程序的稳定性. 所思考, 看全面一些, 才是个人进步的唯一办法.

  • 19
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值