代码随想录刷题 day1二分查找与双指针

本文详细解析了二分查找的两种区间定义方法,探讨了左闭右闭和左闭右开的区别,并介绍了原地移除目标元素的暴力算法与双指针优化。还强调了避免全局变量问题以及设置初始范围的重要性,以减少错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.了解到二分查找的两种写法。

2.将target所在范围区间定义成左闭右闭,当判定nums[mid]>target时,更新r=mid-1;因为nums[mid]不等于target,所以mid不是右边界点,所以要从mid-1开始再次判断。同理当nums[mid]<target时,更新l=mid+1;

3.将target所在范围区间定义成左闭右开,则nums[mid]>target时,更新r=mid;因为mid肯定不是右边界点。  而mid-1可能是target,但是因为右边界是开区间,所以不能取mid-1,因为mid-1还没判定是不是,而mid已经判定不是了,所以取成右边界没关系。

4.对于原地移除目标元素,且不使用额外空间。暴力算法是两层for循环,第一层遍历数组,如果有值和目标值相等,则进行第二层for循环,把之后的值都往前挪一位。注意,此时是在原数组上进行调整的,移位结束后i++,那么也就是说第一层循环的指针应该在数组前移之后-1,才能指向调整前实指向的值。

5.改进方法:双指针法,快慢指针法。时间复杂度从O(n^2)调整为O(n)。进行一层for循环,快指针正常向后进行,当遍历的值和目标值不相等时,用快指针指向的值覆盖在满指针指向的位置上。同时满指针再+1。


续续续:

1.刷题过程中意识到,不能在一开始就将所需要的变量全部定义出来,更不用说全定义成全局变量。eg:int n;in r=n; 我在全局定义这两个变量,但是n此时还没读入,所以r也是n.和你所想要的r值不同。  尽管你在后面读入了n值。

2.二分的时候,l与r值尽量设置成和题目相契合的值的范围,不要超过数组的长度。在某些情况下可能会有错误。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值