本题又是一道二分查找的拓展题,在不考虑时间复杂度的情况下我们也可以用遍历的方式解决此问题,其代码如下:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* searchRange(int* nums, int numsSize, int target, int* returnSize){
int i = 0;
int j = 0;
int *p = (int*)malloc(2 * sizeof(int));
for(i = 0;i < numsSize;i++)
{
if(nums[i] == target)
{
j = i;
break;
}
}
if(i == numsSize)
{
p[0] = -1;
p[1] = -1;
*returnSize = 2;
return p;
}
for(i = j;i < numsSize;i++)
{
if(nums[i] != target)
{
i--;
break;
}
}
if(i == numsSize)
{
i--;
}
*returnSize = 2;
p[0] = j;
p[1] = i;
return p;
}
二分法解题:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* searchRange(int* nums, int numsSize, int target, int* returnSize){
int* p = (int*)malloc(2 * sizeof(int));
if(searchleft(nums,target,numsSize) == -1 && searchright(nums,target,numsSize) == -1)
{
*returnSize = 2;
p[0] = -1;
p[1] = -1;
return p;
}//目标值不在数组范围内
if(nums[searchleft(nums,target,numsSize) + 1] != target)
{
*returnSize = 2;
p[0] = -1;
p[1] = -1;
return p;
}//目标值在数组范围内,但数组内没有目标值
p[0] = searchleft(nums,target,numsSize) + 1;//左边界
p[1] = searchright(nums,target,numsSize) - 1;//右边界
*returnSize = 2;
return p;
}
int searchleft(int* nums,int target,int numsSize)//寻找左边界
{
int left = 0,right = numsSize - 1;
int pleft = -1;
while(left <= right)
{
int mid = left + (right - left)/2;
if(nums[mid] >= target)
{
right = mid - 1;
pleft = right;
}
else
{
left = mid + 1;
}
}
return pleft;
}
int searchright(int* nums,int target,int numsSize)//寻找右边界
{
int left = 0,right = numsSize - 1;
int pright = -1;
while(left <= right)
{
int mid = left + (right - left)/2;
if(nums[mid] <= target)
{
left = mid + 1;
pright = left;
}
else
{
right = mid - 1;
}
}
return pright;
}