二分查找
题目链接
二分查找是一个较为基础的查找方式,对一个有序没有重复值的数组进行查找时,能够提供一个较好的时间复杂度\(O(log(n))\)
算法概要
对于有序并且没有重复值的数组来说,我们可以首先选定整个数组的中间下标,它的值则称为中间值,通过它把大数组分成两个小的数组,其中一个数组包含的全部是小于该中间值的元素(在此检查小数组),另一个数组内的值包含的全部是大于该中间值的元素(在此简称大数组)。因为该数组是有序的,我们可以根据目标值和选定的中间值进行比较大小来选择用哪个小数组进行下一次二分查找。如果中间值比目标值小,我们则选择大数组,如果中间值比目标值大,我们则选择小数组。重复此过程便能得到最后所需要查找的值的下标。
难点——边界问题
在此次做题中,我遇到的困难是边界问题,虽然知道具体的算法该怎么实现,但是在具体大小的比较下还是有点混乱,例如数组区间的左右两边是开口的还是闭合的,导致我一直陷入死循环。
代码随想录提供了一个较为清晰的思路,叫循环不变量法则。通俗的讲,当你的区间是左闭右闭,则之后的数组都需要保持这个状态。其他情况也是一样。
删除数组
心得
这是一道相对简单的题目,我的第一思路是交换需要删除的数值和其他数值的位置得到最后的结果。在看了题解时候我发现不需要进行交换,直接把需要删除的值后面的所有数值往前挪一个位置即可。
在看了题解之后,原来还有快慢指针这个非常方便的方法能够解决这个题目。初始时,我们设置两个指针指向的下标是一致的,当遇到需要删除的值时,慢指针则会停下,让快指针指向后续的元素。之后将快指针指向下标的值不断赋值给慢指针指向的下标的值就结束这道题了。