视频链接:手把手带你撕出正确的二分法 | 二分查找法 | 二分搜索法 | LeetCode:704. 二分查找_哔哩哔哩_bilibilis
第一想法:第一眼将自己学过的二分法的代码背下来,但是写的时候对于while中条件的处理到底要用<=,<并不是非常确定,对于下面中if中如何更新区间也是·迷迷糊糊,侥幸填对了。
看完随想录:
1、对于平常中极易忽略的一个条件mid
mid=(left+right)/2;有时候会产生溢出情况
mid=left+(right-left)/2;
2、对于左闭右闭时
int search(int* nums, int numsSize, int target)
{
int left=0, right=numsSize-1;//左闭右闭中right=numsSize-1;包括这个右边界
while(left<=right)//这是一个合法区间【1,1】
{
int mid=(left+right)/2;
int t=nums[mid];
if(t>target)
{
right=mid-1;
}
else if(t<target)
{
left=mid+1;
}
else
return mid;
}
return -1;
}
3、若是左闭右开时
int search(int* nums, int numsSize, int target)
{
int left=0, right=numsSize;//right取numsSize,右区间取不到
while(left<right)
{
int mid=(left+right)/2;
int t=nums[mid];
if(t>target)
{
right=mid;//mid肯定不是我们搜索的目标,不在我们搜索的区间里,由于右区间取不到,所以取mid;
}
else if(t<target)
{
left=mid+1;//mid肯定不是我们搜索的目标,由于左区间取得到,所以取mid+1;
}
else
return mid;
}
return -1;
}
收获:如何独立根据所选区间的开闭情况来处理区间的更新
第二个题目
数组中移除元素并不容易! | LeetCode:27. 移除元素_哔哩哔哩_bilibili
看到题目第一时间:啥是原地移除,其次是首先决定两层for循环,找到nums中相同的元素,统计数量,再用size减去count;
困难:接上然后然后发现是错误的;在debug过程中发现我的方法,我的第一层循环中的i会一直增加,甚至会跳过我所需要的元素;在删去元素时,i是保持不变的,接下来发现随着我元素的删去,size也是会变化的,于是我就去看了随想录;
看完代码随想录:在遍历过程中j=i-1,就不会出现nums[j+1];因为我们可以确定j的范围;
并学习快慢指针,其实本质就是覆盖原来的数组,感觉还是很好理解的,但是为啥自己没想粗来呢,感觉写的时候,通过画图,可以更好的理解答案;
int removeElement(int* nums, int numsSize, int val) {
int slow=0;
for(int fast=0;fast<numsSize;fast++)
{
if(nums[fast]!=val)
{
nums[slow++]=nums[fast];
}
}
return slow;
}
收获:学习了两个很简单,但是平常中又比较似懂非懂的题目。
学习时长3h10min