day1 算法题
704. 二分查找
文章讲解:programmercarl.com/0704.%E4%BA…
视频讲解:www.bilibili.com/video/BV1fA…
思路: 题目本身较基础,但需要注重该题目前提为有序的数组序列,做法较为简单,主要通过将数组中处于中间位置的元素(该元素也即为大小居中的元素)与目标元素进行比较来逐渐限制其寻找的空间范围大小(也可能直接寻找到)。
代码:
class Solution {
public:
int search(vector<int>& nums, int target) {
int n = nums.size();
int l = 0;
int r = nums.size()-1;
while(l<=r)
{
int t = (l+r)/2;
if(nums[t] == target) return t;
else if(nums[t] > target) r = t-1;
else l=t+1;
}
return -1;
}
};
27. 移除元素
文章讲解:programmercarl.com/0027.%E7%A7…
视频讲解:www.bilibili.com/video/BV12A…
个人思路: 双指针法该题最简单的思路为暴力求解,也即为最简单的做法,时间复杂度为o(n)2,每一次删除元素时,都会对后面所有的元素进行移动,代价较大。双指针法的核心思路为控制两个不同速度的下标,对数组进行访问,本题中采用快指针来遍历该数组,同时采用慢指针来记录当前需要被删除元素对应于该数组所在的第一个位置,而当快指针指向的元素为需要保留的元素时,即可将该元素赋值到该位置,时间复杂度为o(n),相对于暴力求解的办法,减少了每次删除时都需要将后面的元素进行移动的过程。
双指针法(快慢指针法): 通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。
定义快慢指针
- 快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
- 慢指针:指向更新 新数组下标的位置
代码:
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int n = nums.size();
int slow = 0;
int fast =0;
while(fast < n)
{
if(nums[fast]==val){
fast++;
}
else{
nums[slow]= nums[fast];
slow++;
fast++;
}
}
return slow;
}
};