提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
Leetcode704.二分查找
提示:这里可以添加本文要记录的大概内容:
遇到的困惑点
-
为什么初始
right
值指定为right = nums.size()
还是right = nums.size() - 1
?
回答:初始指定为哪一种,根据算法使用的是左闭右闭区间,还是左闭右开区间确定。
左闭右闭区间:使用nums.size() - 1
.Why? 因为下标都是从0开始,所以nums.size()
数值多了一位,如果不减1就会有数组越界行为的风险。下图为这种异常现象:
左闭右开区间:使用
nums.size()
-
如何理解这里的左闭右闭、左闭右开区间,它们的思想是什么?
回答: 在每层逼近目标值时,这层的区间,这个区间是目标值存在的区间。对于区间当然会有三种不同的区间表示方式:左闭右闭、左闭右开、左开右闭。那么在使用不同的区间表示方式时便会有不同的细节点需要注意:
(1)初始right
取值
(2)while循环条件:<
还是<=
(3)right
与left
更新为middle
还是middle - 1
还是middle + 1
3.还有一个思考:至关重要
在while
循环中使用<
还是<=
号,就已经定下了使用的是左闭右开写法,还是左闭右闭写法;可以这样理解
使用 < 号 <===> 左闭右开写法 <===> left = middle +1; right = middle;
使用 <= 号 <===> 左闭右闭写法 <===> left = middle +1; right = middle - 1;
提示:以下是本篇文章正文内容,下面案例可供参考
Leetcode27.原地删除数组元素
双指针的核心思想:通过一个快指针和一个慢指针在一个for循环里面完成两个for循环的工作。
快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
慢指针:指向更新 新数组下标的位置
注意:核心思想就是这两句话,对于快慢指针的解释。
移除重复元素
暴力破解
遇到的问题
1.数组长度为1,或者0时的情况单独讨论了
2.在双循环中,重复元素之后的元素整体前移后,没有更新外循环变量,漏掉重复元素
代码
//暴力破解
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int len = nums.size();
if(nums.size() < 2){
return 1;
}
else{//数组长度大于等于2
for(int i = 0; i < len;i++){
if(nums[i - 1] == nums[i]){
for(int j = i; j < len;j++){
nums[j - 1] = nums[j];
}
i--;
len--;//更新 新数组长度
}
}
}
return len;
}
};
双指针方式
遇到的疑惑
1.在检索相邻两个元素不相同时,我的思想总是在考虑他们两个相同的情况。没有想到从他们的对立面去考虑。使用不相同来进行判断。
核心思想
仍然是:
快指针:用与查找新数组元素,找出相邻的不相同的元素
慢指针:更新新数组,将快指针找到的新数组元素更新到新数组中
参考文献
https://programmercarl.com/0027.%E7%A7%BB%E9%99%A4%E5%85%83%E7%B4%A0.html
https://programmercarl.com/0704.%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE.html