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。