code
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int leftBinary(int*nums,int left,int right,int target){
while(left<=right){
int mid=left+((right-left)>>1);
if(nums[mid]>=target){
right=mid-1;
}
else{
left=mid+1;
}
}
return left;
}
int rightBinary(int *nums,int left,int right,int target){
while(left<=right){
int mid=left+((right-left)>>1);
if(nums[mid]<=target){
left=mid+1;
}
else {
right=mid-1;
}
}
return right;
}
int* searchRange(int* nums, int numsSize, int target, int* returnSize) {
int *ans=(int*)malloc(sizeof(int)*2);
int leftBorder=leftBinary(nums,0,numsSize-1,target);
int rightBorder=rightBinary(nums,0,numsSize-1,target);
if(leftBorder>rightBorder) { //判断如果元素为空,或不存在其元素
ans[0]=-1;
ans[1]=-1;
}
else{
ans[0]=leftBorder;
ans[1]=rightBorder;
}
*returnSize=2;
return ans;
}
踩过的坑
1.mid要防止溢出
2.函数返回值:
left查找返回left
right查找返回right
3.当函数值==target,继续移动至边界
4.
if(leftBorder>rightBorder) { //判断如果元素为空,或不存在其元素
ans[0]=-1;
ans[1]=-1;
}
如果是空集,则right=-1,left=0自动退出循环
如果不存在target,则根据循环结束条件,right恒小于left