需求描述:給定一個按照升序排列的整數數組nums,和一個目标值target。找出給定目标值在數組中的開始位置和結束位置。
如果數組中不存在目标值target,返回[-1,-1];
進階:你可以設計并實現時間複雜度為O(logn)的算法解決次問題嗎?
	
	int main() {
 //    int nums[6] = {5,7,7,8,8,10};
    int nums[2] = {2,2};
    int returnSize = 0;
    int* res = searchRange(nums, 2, 2, &returnSize);
    for(int i=0;i<returnSize;i  ) {
        printf("%d ",res[i]);
    }
    printf("\n");
  return 0;
}
#pragma mark - 在排序數組中查找元素的第一個和最後一個位置
int* returnDef(int* res,int* returnSize,int number) {
    res[(*returnSize)  ] = number;
    res[(*returnSize)  ] = number;
    return res;
}
int binarySearch(int* nums,int target,int i,int j) {
    while (i <= j) {
        int m = (i   j) / 2;
        if(nums[m] == target) {
            return m;
        }else if (nums[m] < target) {
            i = m   1;
        }else {
            j = m - 1;
        }
    }
    return -1;
}
int* searchRange(int* nums, int numsSize, int target, int* returnSize) {
    *returnSize = 0;
    int* res = (int*)malloc(2000 * sizeof(int));
    if(numsSize == 0) return returnDef(res,returnSize,-1);
    if(numsSize == 1) {
        if(nums[0] == target) return returnDef(res,returnSize,0);
        return returnDef(res,returnSize,-1);
    }
    if(target > nums[numsSize -1] || target < nums[0]) return returnDef(res,returnSize,-1);
    //采用二分查找
    int i = 0;
    int j = numsSize - 1;
    int m = binarySearch(nums,target,i,j);
    if(m >=0) {
        *returnSize = 2;
        int left = m;
        while (left>=0 && nums[left] ==target) {
            res[0] = left--;
        }
        int right = m;
        while (right<numsSize && nums[right] == target) {
            res[1] = right  ;
        }
        return res;
    }
    //m < 0
    return returnDef(res,returnSize,-1);
}
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!