704.二分查找
题目链接:https://leetcode.cn/problems/binary-search/
解答:https://programmercarl.com/0704.%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE.html
能够写出大概二分查找,但是还是因为循环边界的判定出问题了,我写的是while(left < right -1) ,这应该是左闭右开的写法,但是我又用了right=nums.length -1, 这是左闭右闭的写法,所以在数组只有1或2个元素的时候就会出问题。
而且一开始判断大小之后写的还是right=mid 和 left=mid,这应该属于左开右开的写法?(可能没这个玩意😂),总之确实是一团乱。
之后看解析,逻辑就清晰多了,虽然只要求了左闭右闭合左闭右开两种写法,顺便也把左开右闭的写法理解了(虽然一般不会用这个)主要是为了把区间彻底整明白~
左闭右闭:left=0, right=nums.length-1; while(left<= right); right = mid-1; left = mid +1;
左闭右开:left =0, right = nums.length; while(left < right); right=mid; left = mid+1;
左开右闭:left =-1, right = nums.length or left =0, right = nums.length-1; while(left < right); mid = (right-left)/2 +1+left; right = mid-1; left = mid
最后还有一点,一开始自己写的是mid=(left+right)/2, 但答案都是mid=(right-left)/2 +left;群里面给出的解答:主要是为防止C/C++下int类型溢出,四字节情况下int的范围是-2147483648 到2147483647,假设left = 1, right = 2147483647, 那么left + right就会超出int的正数范围,变成-2147483648,Python的话应该没有这个问题
27.移除元素
题目链接:https://leetcode.cn/problems/remove-element/
解答:https://programmercarl.com/0027.%E7%A7%BB%E9%99%A4%E5%85%83%E7%B4%A0.html
自己尝试用双指针的方法写了一下,时间花的有点久,但还是写出来了
错误1.没有考虑空数组的特殊情况
错误2. 逻辑出错;当后指针right到达数组结尾时,我还把前指针left往后移动直到下一个val,这一步是没必要的,直接返回前指针的值就可以了,因为在前面的遍历步骤中,后指针right经历过的每一个非val值都已经前移到前指针了
35.插入元素
题目链接:https://leetcode.cn/problems/search-insert-position/
找到目标值并返回其索引和二分查找的步骤一样;而如果目标不存在于数组中,返回它将会被按顺序插入的位置,即最后是return left即可
注意数组的条件:nums为无重复元素的升序排列的数组
34.在排序数组中查找元素的第一个和最后一个位置
题目链接:https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array/
在二分法的基础上向区间前后拓展一下,⚠️查找时不能超过区间[0, nums.length-1]这个范围,否则数组下标就越界了
我自己写的是:
while (front>0){
if(nums[front-1]!=target) break;
front--;
}
while (back<nums.length-1){
if(nums[back+1] != target) break;
back ++;
}
ans[0]=front;
ans[1]=back;
return ans;
还没有看答案🥹