算法题打卡day1 | 704. 二分查找、27. 移除元素

文章讲述了在LeetCode上解题的经验,重点分析了二分查找算法的优化细节,指出使用右边界加权平均求mid可避免超时问题。同时讨论了移除元素问题,对比了暴力解法和快慢指针方法的时间复杂度和空间复杂度。此外,还复习了数组的基础知识,包括C++和Java中二维数组的差异,以及STLvector的工作原理和性能优化技巧。
摘要由CSDN通过智能技术生成

704. 二分查找 - 力扣(LeetCode)

状态:第一次超时,排查发现要写成

mid = right + (left-right>>1);

题目本身没有难度,注意循环终止条件和边界更新条件即可。

我的惯用写法是左闭右闭,即:

// 伪代码
while(right <= left){
    mid = right + (left - right >> 2);
    if(mid == target) retrun;
    if(mid < target) right = mid + 1;
    if(mid > target) left = mid - 1;
}

至于其他写法,为防止混淆就不写了。

27. 移除元素 - 力扣(LeetCode)

状态:第一次暴力解法AC,快慢指针方法一开始没想到,更多的注意力放在了双指针的思路上,后面得知是快慢指针之后AC。

暴力解法没什么好说的,先把目标数组的长度获得,然后进行一个二重遍历,每遍历至一个需要删除的元素,就用循环把后面的元素往前移一位。时间复杂度O(n^2),空间复杂度O(1)

快慢指针的思路想到很容易,因为遍历是单向的,需要删除的元素没什么可惜的直接覆写即可。所以可以用一个指针来指向可往里写的索引位置(即最终数组的位置),这个指针只有在当前位置写入符合条件的值之后才会向后移,可以理解为慢指针;另一个指针用来寻找那些符合要求的值(即不用被删除的值) ,整体的遍历也是通过它进行,可以理解为快指针。用人和房子做比方的话,慢指针指向对的房子,快指针去找对的人。时间复杂度O(n),空间复杂度O(1)

第一天热热身,帮助回忆一下写代码的感觉,不过值得注意的是,在面试过程中可能存在需要在本地构建完整代码的情况,其中特点结构体(链表、二叉树等)的编写,头文件的添加,多轮测试框架的编写,测试用例的构建以及解答类的应用都是需要注意的问题。

今天还复习了一下数组的相关知识。

数组是在连续内存存放同一类数据结构的集合。其中的元素不能被删除,只能被覆写。对于二维数组,C++中也是以连续内存地址来存放,而Java中则对不同行的地址分开存放。

STL中的vector虽然使用起来和数组很类似,但它是容器而不是数组。它的底层实现是数组,在扩容时会申请一个2倍于原先大小的连续内存,然后再将数据移动过去。所以vector的插入操作有概率导致性能下降。而emplace()(C++11)性能上也比insert()高,因为后者需要调用类的构造函数和移动构造函数(或拷贝构造函数),而通过 emplace() 函数实现同样的功能,只需要调用构造函数即可。不过insert()一次可以插入多个元素,emplace()一次只能插入一个。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值