二分查找
初版代码
class Solution {
public:
int search(vector<int>& nums, int target) {
//左右双指针,取左闭右闭集合[l,r]
int l=0,r=nums.size()-1;
//l==r有意义
while(l<=r)
{
int mid=(l+r)/2;
if(nums[mid]==target)return mid;
else if(nums[mid]<target)l=mid+1;
else r=mid-1;
}
return -1;
}
};
二分查找是一种基础的算法,虽然写过很多次但是对于区间的选取并没有过多的注意,下意识地写的都是取[l,r],并没有尝试过[l,r)
第二种方法
class Solution {
public:
int search(vector<int>& nums, int target) {
//左右双指针,取左闭右开集合[l,r)
int l=0,r=nums.size();//注意这里右边界发生改变
//l==r没有意义
while(l<r)
{
int mid=(l+r)/2;
if(nums[mid]==target)return mid;
else if(nums[mid]<target)l=mid+1;
else r=mid;//这里取值也要改变,因为没有取到右边界所以这里直接r=mid
}
return -1;
}
};
题目描述不能用额外空间,显然要使用当前数组,并且要求把目标元素移到数组最后面所以使用双指针(快慢指针)
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
//取左右边界
int length=nums.size(),l=0,r=nums.size()-1;
//当l>r时所有元素都被遍历过
while(l<=r)
{
//当nums[l]==val时交换左右指针元素,右指针--,左指针不变因为右指针换过去的可能也是目标元素
if(nums[l]==val)
{
swap(nums[l],nums[r]);
length--;
r--;
}
//不相等的时候l++
else
{
l++;
}
}
//循环结束时刚好l>r
return length;
}
};