7.10(补签)代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素、977.有序数组的平方

一、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数组就可以解出。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值