题目
初见思路
704. 二分查找
以前做过的一道题,但有些忘了。因为数组已经排好序,第一想法是在一个while loop中比较数组中间值和目标值的大小,如果大于就再比较左边区间中间值和目标值的大小 m = m / 2
, 如果小于就再比较右边区间中间值和目标值的大小 m = (nums.size() - m) / 2 + m
. 因为不太确定什么时候退出while loop, 就把迭代次数设置成了nums.size() / 2
. 可以通过小部分测试,但大部分是错的。
27. 移除元素
也是以前做过的一道题,想到了暴力法和快慢指针,想着实现一下快慢指针,但还是写出了两层loop,代码也有错。
更新思路
704. 二分查找
看了代码随想录后明白应该使用左右两个下标l, r
, 分别对应当前区间的左右。修改之前的代码,将loop的条件设置为l <= r
, 如果l
超过了r
代表没有对应目标值,就结束loop返回-1。进入loop时更新m
的值,更新为当前l, r
的中间下标m = (l + r) / 2
。中间值等于目标值的话就返回m;大于就将r
移至m
的左边,r = m - 1
, 这样下一个循环时就只在左边的区间比较(比当前nums[m]
小);小于中间值,l = m + 1
。
写的时候没有先更新m
而造成后面的比较都是错误的,上一个循环中更新了l或者r
,进入新的循环时应该首先更新m
。
27. 移除元素
看完代码随想录之后的发现当快指针的值和val不相等时只用增加快指针的值就可以了(跳过相等的值,之后会重新赋值覆盖掉),当不等时,nums[a] = nums[b]
, 再增加快慢指针。
今日总结
学习时长
2h
收获
数组双指针,快慢指针,注意总结。