二分查找:代码随想录 (programmercarl.com)
由于我是算法小白,虽然这一部分之前刷过一遍,现在还是忘记了,我的刷题策略是直接看题解,把题解完全的看明白之后,再跟着敲代码所以就没有看见题目的第一想法。
看过卡哥的视频讲解之后我的印象更深了,之前刷的时候是直接看的代码随想录题解,没有看视频,如今再来看视频感觉比题解更加加清晰易懂,下面我就来说一说在视频和题解中我认为的一些重点。
使用前提:当看到1.有序数组,2.没有重复元素的时候要想到二分查找的方法。
一个中心:二分查找的核心就是要确定数组的范围情况是左闭右闭【left,right】还是左闭右开
【left,right),再根据此分类来确定接下来的条件。
三个基本点:
- 根据之前确定的【】or【)来选择right初始值,若为【】由于可以取到最右边的值,则设为
-
nums.size() - 1;
若为【)则不能取到最右边的值,设为
right = nums.size()
- 根据之前确定的【】or【)来选择
while (left <= or < right)
当left==right,区间[left, right]依然有效,所以用 <=
当left==right,区间[left, right)无效,所以用 <
- 重新确定边界时right=middle还是middle - 1.
若时【)的情况则right=middle,left=middle+1.
移除元素: 代码随想录 (programmercarl.com)
本题使用了双指针法(快慢指针法)代码十分简洁,重点是理解快慢指针的作用。
快指针作用:便历数组,找到新数组需要的元素,(是找到,而不是遍历的每一个都是新数组需要的元素)
慢指针的作用:获取的是新数组在原来数组的基础上需要更新的位置。
之后要是忘记了的话,可以看看视频,卡哥演示的过程十分清楚。
今日总结:今天算法题加上博客大概写了两个小时左右,因为是之前做过的所以时间不长,之后花在算法上的时间肯定越来越多,但是不要把担心,有群的的各位一起讨论,相信我一定能坚持。