题目 704.二分查找
视频 代码随想录讲解视频
两种情况:左闭右开,左闭右闭
需要注意的重点:
1.循环的限制的条件
2. l , r 的更新结果
3.求middle的公式(这么写不容易溢出)
左闭右开
class Solution {
public:
int search(vector<int>& nums, int target) {
//左闭右开
int l=0,r=nums.size();
while(l<r)
{
int m=l+(r-l)/2;
if(nums[m]<target)
l=m+1;
else
if(nums[m]>target)
r=m;
else
return m;
}
return -1;
}
};
左闭右闭
class Solution {
public:
int search(vector<int>& nums, int target) {
//左闭右闭
int l=0,r=nums.size()-1;
while(l<=r)
{
int m=l+(r-l)/2;
if(nums[m]<target)
l=m+1;
else
if(nums[m]>target)
r=m-1;
else
return m;
}
return -1;
}
};
题目 27.移除元素
视频 代码随想录讲解视频
三种方法:
1.暴力算法
2.双指针
3.双指针2.0
暴力算法
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int size=nums.size();
for(int i=0;i<size;i++)
{
if(nums[i]==val)
{
for(int j=i+1;j<size;j++)
nums[j-1]=nums[j];
i--;
size--;
}
}
return size;
}
};
双指针
fast在前探路,若遇到不等于val的数,直接赋给数组slow.
class Solution
{
public:
int removeElement(vector<int>& nums, int val)
{
int fast=0,slow=0;
for(fast=0;fast<nums.size();fast++)
{
if(nums[fast]!=val)
{
nums[slow]=nums[fast];
slow++;
}
}
return slow;
}
};
双指针2.0
l从前往后探路,若遇到val,则用r从后往前赋给val所在的数组位置,直到下标是l的数组内容不等于val,l再接着往后走。
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int l=0,r=nums.size();
while(l<r)
{
if(nums[l]==val)
{
nums[l]=nums[r-1];
r--;
}
else
l++;
}
return l;
}
};
总结:
1.第一次接触双指针,很聪明的想法。
2.深入的明白了二分查找。