代码随想录算法训练营第一天|704.二分查找、27.移除元素
704. 二分查找
文档讲解:https://programmercarl.com/0704.二分查找.html
状态:独立实现
思路
二分查找是一个很经典的题目,遇到按大小排序的数组且元素不重复,基本都可以使用二分查找法,他的精髓就是双向指针,要注意的是对于区间“=”的判断。
时间复杂度:O(log n),空间复杂度:O(n)
代码随想录思路
其实基于对于区间开闭的选择有两种方法可以解决这个问题,不过我还是喜欢使用感觉更常规化的右指针指向nums.size()-1的方法。
实现过程中的困难
这题太经典了,没有困难
收获
这道题耗时0.5小时。时间复杂度的计算有些忘了,每次写代码要记得自己计算一下,面试时候还是会有被问到的可能的。
实现代码
class Solution {
public:
int search(vector<int>& nums, int target) {
int num_size=nums.size();
int left_point=0;
int right_point=num_size-1;
int result_point=(left_point+right_point)/2;
for(int result_point=(left_point+right_point)/2;left_point<=right_point;result_point=(left_point+right_point)/2){
if(nums[result_point]>target){
right_point=result_point-1;
}
else if(nums[result_point]<target){
left_point=result_point+1;
}
else if(nums[result_point]==target){
return result_point;
}
}
return -1;
}
};
27.移除元素
文档讲解:https://programmercarl.com/0027.移除元素.html
状态:没做出来
思路
对于这道题也有考虑过两个指针实现,但是对于指针什么时候++和赋值脑子一团浆糊,最后只能看了解析。
代码随想录思路
对于这道题可以使用快慢指针和双向指针两种方法实现,本质都是通过循环用不为val的元素来覆盖等于val的元素,直到数组中所有元素都被判断并处理过。
时间复杂度:O(n),空间复杂度:O(1)
实现过程中的困难
大概的思路有,但是对于具体指针的处理还是很迷糊,下次画个示意图可能会好很多。
收获
这道题耗时1小时。对于复杂一点的算法题不能光靠脑子想,在纸上做个简单的模拟可能会拓宽思路。
实现代码
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int quick_point=0,slow_point=0;
for(;quick_point<nums.size();quick_point++){
if(val!=nums[quick_point]){
nums[slow_point]=nums[quick_point];
slow_point++;
}
}
return slow_point;
}
};

浙公网安备 33010602011771号