题目链接
目录
1.二分查找常见误区
2.快慢指针
一. 二分查找
由题,给出了明显提示,有序数组和无重复元素,这是在提示使用二分查找,具体代码如下
int search(int* nums, int numsSize, int target){
int i=0;
int j=numsSize;
while(i<j)//
{
int mid=(i+j)/2;
if(target>nums[mid])
{
i=mid+1;
}else if(target<nums[mid])
{
j=mid;
}else{
return mid;
}
}
return -1;
}
或者
int search(int* nums, int numsSize, int target){
int i=0;
int j=numsSize-1;
while(i<=j)//
{
int mid=(i+j)/2;
if(target>nums[mid])
{
i=mid+1;
}else if(target<nums[mid])
{
j=mid-1;
}else{
return mid;
}
}
return -1;
}
在写的过程中有两个注意的点:
1.i<j or i<=j
2.i=mid or i=mid+1
方法:明确target 是在闭区间还是在开区间内
1.当target在闭区间内,则i=numsSize-1,i<=j
2.反之在左闭右开内,i=numsSize,i<j
二,快慢指针
1,常见使用场景:当遇到需要两重循环解决时,可考虑快慢指针
代码如下
int removeElement(int* nums, int numsSize, int val){
int fast=0,slow=0;
int cnt=0;
for(fast=0;fast<numsSize;fast++)
{
if(nums[fast]!=val)
{
nums[slow++]=nums[fast];
cnt++;
}
}
return cnt;
}
2.具体解释
fast 指针获取题目要求所需要的元素赋值给slow指针,从而实现遍历一次且不额外开辟数组空间的效果