代码随想录算法训练营第一天|数组理论基础,704.二分查找,27.移除元素
1.LeetCode 704二分查找
1.1题目链接:704.二分查找
文档讲解:代码随想录
视频讲解:代码随想录算法公开课
1.2 思路:看到题目第一想法就是暴力解法,但是考虑到实际要求是不可以的,采用二分法进行区间分割查找速度会更快。对于二分法左闭右闭比较熟悉,但是左闭右开的不太熟悉,容易搞混二者,通过看视频讲解理清二者区别:主要是看等号成立时左右都闭合情况是否符合实际,另外需要注意二分法应用的条件:有序数组元素不重复。
1.3 附加代码如下:
在这里插入代码片
//二分法左闭右闭情况
class Solution {
public:
int search(vector<int>& nums, int target) {
int left =0;
int right=nums.size()-1;
while(left<=right)
{
int middle=(left+right)/2;
if(nums[middle]>target)
{
right=middle-1;
}
else if(nums[middle]<target)
{
left=middle+1;
}
else
{
return middle;
}
}
return -1;
}
};
//二分法左闭右开情况
class Solution{
public:
int search(vector<int>& nums,int target){
int left=0;
int right=nums.size();
while(left<right)
{
int middle=(left+right)/2;
if(nums[middle]>target)
{
right=middle;
}
else if(nums[middle]<target)
{
left=middle+1;
}
else
{
return middle;
}
}
return -1;
}
};
1.4 补充练习
Leetcode 35.搜索插入位置 题目链接
Leetcode 34.在排序数组中查找元素的第一个和最后一个位置 题目链接(后续补充)
2.Leetcode移除元素
2.1题目链接:移除元素
文章讲解:代码随想录
视频讲解:卡哥视频讲解
2.2 思路:看到题目的第一想反应还是去用暴力列举法,两个for循环进行遍历实现目的。看了代码随想录的B站视频掌握了使用双指针实现遍历,从时间复杂度上O(n×n)->O(n)
2.3 附加代码如下(包括暴力列举法和双指针法)
双指针原理:采用初始为零的两个指针,快指针进行原数组元素遍历,当满足遍历中的元素值不等于要删除的元素值,则将该元素值赋给慢指针,这样慢指针保留下来的就是满足题目要求的新数组。类似于读写操作一样,一个负责读取数据一个负责记录满足条件的数据。
2.3.1暴力列举法
class Solution{
public:
int removeElement(vector<int>& nums, int val){
int length=nums.size();
for(int i=0;i<length;i++)
{
if(nums[i]==val)
{
for(int j=i+1;j<length;j++)
{
nums[j-1]=nums[j];//思考一下如果是删除最后一个元素,要覆盖的话怎么成立,其实就是那后面没有给定初始值(默认为零)的覆盖
}
i--;//思考一下为什么有这一步,是不是因为数组元素都向前移动一步
length--;
}
}
return length;
}
};
2.3.2 双指针法
class Solution {
public:
int removeElement (vector<int>& nums,int val){
int slow=0;
int fast;
int length=nums.size();
for(fast=0;fast<length;fast++)
{
if(nums[fast]!=val)
{
nums[slow]=nums[fast];
slow++;
}
}
return slow;
}
};