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

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()一次只能插入一个。

你可能感兴趣的:(算法题练习,算法)