704.二分查找
思路:
首先想到的是暴力解法,遍历数组;其次联想到二分法
代码随想录方法:
代码随想录里的方法提供了两种写法,左闭右闭和左闭右开两种写法,这两种写法的区别主要有以下两点
- while循环的结束判断是否带等号
- 对nums[middle]和val的大小关系进行判断以后,左闭右闭写法需要对左右分别加一/减一,而左闭右开写法只需要对左加一,右边可以直接等于middle,因为下一个查询区间不会去比较nums[middle]。
学习收获:
- 巩固了二分法的两种写法
27.移除元素
思路
暴力解法需要注意的地方比较多,因为在删除元素后,容易产生索引越界的问题,所以每次移除一个元素以后,都要将遍历时的数组大小减一;由于移除了元素,所以外层遍历的索引i
需要作i--
处理,该暴力解法非常容易漏步骤
双指针是记忆比较深刻的解法,设置read指针为快指针,write指针为慢指针。write指向需更新数组下标的位置
代码随想录方法:
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int write= 0;
for (int read= 0; read< nums.size(); read++) {
if (val != nums[read]) {
nums[write++] = nums[read];
}
}
return slowIndex;
}
};
隐藏的逻辑为:为若val = nums[read]
,则read继续向前移动,而write停留在需更新的位置。
学习收获
双指针方法