题目:
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
进阶:
你可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗?
示例1:
输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]
示例2:
输入:nums = [5,7,7,8,8,10], target = 6
输出:[-1,-1]
示例3:
输入:nums = [], target = 0
输出:[-1,-1]
提示:
0 < = n u m s . l e n g t h < = 1 0 5 0 <= nums.length <= 10^5 0<=nums.length<=105
- 1 0 9 < = n u m s [ i ] < = 1 0 9 10^9 <= nums[i] <= 10^9 109<=nums[i]<=109
nums 是一个非递减数组
- 1 0 9 < = t a r g e t < = 1 0 9 10^9 <= target <= 10^9 109<=target<=109
解题代码:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int binarySearch(int* nums, int left, int right, int target){
if(left > right)
return -1;
int mid = (left + right) / 2;
if(nums[mid] == target)
return mid;
else if(nums[mid] > target)
return binarySearch(nums, left, mid - 1, target);
else
return binarySearch(nums, mid + 1, right ,target);
return -1;
}
int* searchRange(int* nums, int numsSize, int target, int* returnSize){
*returnSize = 2;
int* retNums = (int*)malloc(2 * sizeof(int));
retNums[0] = -1;
retNums[1] = -1;
// 二分查找法找到target在数组中的位置
int index = binarySearch(nums, 0, numsSize - 1, target);
if(index == -1)
return retNums;
// 找到左边界
if(index > 0)
while(index > 0 && nums[index] == nums[index-1])
index--;
retNums[0] = index;
// 找到右边界
if(index < numsSize - 1)
while(index < numsSize - 1 && nums[index] == nums[index+1])
index++;
retNums[1] = index;
return retNums;
}