自己看到题目的第一想法
经典的二分查找, 应该是比较简单的. 首先计算出中间索引, 根据计算出的中间索引获取到对应下标的值, 根据该值与目标值的大小左比较, 得到目标值所处于的更小的区间. 重复该步骤最终将目标锁定再[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 的话, 不应该出现这样的错误.
自己看到题目的第一想法
从头开始遍历, 遇到需要移除的元素, 就将该元素之后的所有元素向前挪一位. 最坏的情况就是每一位都需要移动, 这时候时间复杂度为 o(N^2).
看完代码随想录之后的想法
快慢指针是什么?
快指针是用来遍历所有元素的.
慢指针指向的是结果数组的无内容的索引位置, 发现一个不需要剔除的元素, 就将对应的元素复制到索引对应的位置, 同时将慢指针前移一位.
好像以前看过, 又好像没有. 然而依旧觉得惊为天人, 真是个天才的想法.
自己实现过程中遇到哪些困难
好像没有.
今日收获,记录一下自己的学习时长
大概从中午11点开始, 陆陆续续学到下午2点. 还完成了拓展练习中的[LeetCode 34] 在排序数组中查找元素的第一个和最后一个位置 [LeetCode 35] 搜索插入位置 . 期间还有分心和吃饭的时间, 实际学习用大概2.5个小时左右.
本质上说, 二分法查找也是双指针的思想. 难点就在于每一次缩小区间时, 区间的边界在哪里. 而移除元素也是双指针的思想, 一开始总觉得很疑惑, 数组的内容不断被修改, 似乎特别的混乱. 然而当想明白 slowIndex 和 fastIndex 第一次分离的时候, slowIndex 所指向的空间便是被释放的空间了, 而剩余所有能添加到指定空间的数量, 也小于 slowIndex 所拥有的空间数量. 因此元素都将被有序的前置, 同时少了一次 for 循环移动数据, 大大的提高了算法的性能. 因此, 说算法不重要的自己, 确实是眼界太低. 好的算法可以提高程序的性能, 扎实的算法可以提高程序的稳定性. 所思考, 看全面一些, 才是个人进步的唯一办法.