一、704. 二分查找
注意点:二分查找必须有序! 时间复杂:O(log n),空间复杂度:O(1)
之前写过的二分,回过头写还是没办法思路清晰直接解出。
1.确认区间法来写while()循环条件,虽然分左闭右闭和左闭右开,但本人写起来还是习惯左闭右闭的方式,所以只以此记录易错点,另一种方法防止混肴,就不记录了。
while(left <= right) ->
if(nums[mid] > target){right = mid - 1;} if (nums[mid] < target) {left = mid + 1;}
2.mid的防溢出写法:
mid = left +(right - left)/2;

最终左闭右闭代码:

二、27. 移除元素
因为这道题的测评机制是读入你输出K,然后对原数组的前K个值进行排序,然后检测,所以本体不能够再造新数组进行答题,故一般在原数组上使用双指针进行操作。
1.双指针从头部出发,对 nums[i] !=val 进行判断,若true,则将nums[i]覆写到nums[k++]上,完成整个数组的遍历移除元素。

2.头尾指针法,设置left, right头尾指针。循环条件为while(left < right),但是之后写了一遍发现不对,发现这种方法也需要注意区间的区分:
2.1 左闭右闭:
right 写成闭区间,那么while循环条件也需要是闭区间,因为right表示右指针,所以最终数组的size数需要+1,即为right +1;
2.2 左闭右开:

这里的right刚开始就表示数组的size,故最终直接返回right,即为新数组的size。
3.双头指针和头尾指针比较:

因本题输出算法会排序数组,故第二中不保序版可以使用。
三、977.有序数组的平方
暴力解法:今天的面试到此结束

解法:头尾指针:根据题意可知难点主要考虑负数情况,所以最大值一般出现在头尾两侧,并且这种情况会依次循环,故选择头尾指针法依次比较,写出递减数组之后再reverse数组就可以解出。


被折叠的 条评论
为什么被折叠?



