思路
1、折半查找(Seekaim),寻找target位置
2、范围搜索(Seekrange),确定target边界
代码
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int Seekaim(int* nums, int aim, int left, int right) {
//在[l,r]搜寻aim的位置,-1:不存在
if(nums[left] <= aim && aim <= nums[right]) {
while(left < right) {
if(nums[(left+right)/2] < aim) {
left = (left+right)/2+1;
}else {
right = (left+right)/2;
}
}
}
return nums[left] == aim?left: -1;
}
void Seekrange(int* nums, int numsSize, int Index, int* ret) {
int left=Index,right=Index;
while(left>=1 && nums[left-1]==nums[Index]){left--;}
while(right<numsSize-1 && nums[right+1]==nums[Index]){right++;}
ret[0]=left;
ret[1]=right;
}
int* searchRange(int* nums, int numsSize, int target, int* returnSize){
*returnSize=2;
int *ret=(int*)malloc(sizeof(int)*2);
int Index=-1;
if(numsSize-1>=0)
Index=Seekaim(nums,target,0,numsSize-1);
ret[0]=Index;
ret[1]=Index;
if(Index>=0)
Seekrange(nums,numsSize,Index,ret);
return ret;
}