D1|704.二分查找、27.移除元素

LeetCode 704.二分查找

题目:给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值target ,写一个函数搜索nums中的 target,如果目标值存在返回下标,否则返回 -1。

代码:

原题代码

注意点:

1、循环的条件是leaf<right?还是left<=right?

判定循环的条件时,要看在加上等号之后,循环所在的区间是否有意义。例如:若left=right=1,则针对于搜索区间[1,1]是有意义的,此时循环判断条件应写为left<=right;但针对于区间[1,1),是无意义的,此时的循环判断条件应写为left<right;本题的测试代码给出的是全闭区间,所以代码是left<=right。

2、在更新左右区间的时候left、right值与middle的关系应该如何?

对于全闭区间[a,b],因为middle点处的值在第一次循环里就参与了判断,在之后的循环里就不应该参与判断,所以left=middle+1,right=middle-1;但对于左闭右开区间[a,b),倘若更新的是right值,因为右侧是开区间,同时为了保证每一个数值都能取到,所以right=middle。倘若更新的是left值,左侧是闭区间,所以left=middle+1。

3、在更新middle时,middle=left+(right-left)/2相比于middle=(left+right)/2能防止越界的发生。


LeetCode 27.移除元素

题目:给你一个数组 nums 和一个值 val,你需要原地移除所有数值等于val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

代码:

原题代码

方法:

法一:第一遍做用的是暴力解法,外层利用for循环遍历数组,内层查找需要删除的数据,利用for循环实现数组的更新。这样做代码复杂,不是一个好方法。

法二:第二遍看了视频,了解了双指针法。定义两个变量fast、slow。fast用于在nums里面找数,slow用于记录fast找到的数应该存在哪里。运行过程是:fast先在nums里面找数,如果不是要删除的数val,就把数放在下标为slow的地方,slow++、fast++。当fast找到了要删除的数val,slow不更新,此时nums[slow]=val,fast继续向后移动,当下一个非val的数来时,nums[slow]=nums[fast]的操作将原来val的地方填入新的非val数,这个操作就实现了删除val。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容