难度中等1106收藏分享切换为英文接收动态反馈
给定一个按照升序排列的整数数组 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 <= nums.length <= 105
-109 <= nums[i] <= 109
nums
是一个非递减数组-109 <= target <= 109
通过次数285,534提交次数671,266
----------------------------------分割线-----------------------------------------
先来暴力破解的
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* searchRange(int* nums, int numsSize, int target, int* returnSize){
//1. 暴力
int i;
int cnt=0;
int *ret = (int *)malloc(sizeof(int)*2);
ret[0]=-1;
ret[1]=-1;
for(i=0;i<numsSize;i++){
if(nums[i]==target)
{
if(cnt==0){
ret[0]=i;
ret[1]=i;
} else {
ret[1]=i;
}
cnt++;
}
}
*returnSize = 2;
return ret;
}
待补充二分法的,题目有引导使用二分法的关键字:1. 升序 2.时间复杂度为 O(log n)
二分法的思路,
1. 先二分法搜一次,看能不能找到任意一个target值
2. 找不到,则返回[-1,-1]; 如果能找到,则分左右区间,左右区间分别再用二分法搜一遍
ps(左右区间搜索代码没封装函数,还可优化)
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* searchRange(int* nums, int numsSize, int target, int* returnSize){
int tmp = 0;
int l = 0 ;
int r = 0;
int mid = 0;
int *ret = NULL;
ret = (int *)malloc(sizeof(int)*2);
ret[0] = -1;
ret[1] = -1;
* returnSize = 2;
if(numsSize==0){
//printf("%d %d\n",ret[0],ret[1]);
return ret;
}
l = 0;
r = numsSize-1;
//1. 先找任意位置的target
while(l <= r){
mid = l+(r-l)/2;
if(nums[mid] == target){
ret[0]=mid;
ret[1]=mid;
tmp = mid;
break;
} else if(nums[mid]>target){
r = mid-1;
} else if (nums[mid]<target){
l = mid+1;
}
}
if(ret[0] == -1)
{
return ret;
}
l = 0 ;
r = tmp;
while(l<=r){
mid = l+(r-l)/2;
if(nums[mid] == target){
r = mid-1;
if((r<0)||(nums[r]!=target)){
ret[0]=mid;
break;
}
} else if (nums[mid]<target){
l = mid+1;
}
}
l = tmp ;
r = numsSize-1;
while(l<=r){
mid = l+(r-l)/2;
if(nums[mid] == target){
l = mid+1;
if((l>(numsSize-1))||(nums[l]!=target)){
ret[1]=mid;
break;
}
} else if (nums[mid]>target){
r = mid-1;
}
}
return ret;
}