需求描述:給定一個按照升序排列的整數數組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每日頭條,我们将持续为您更新最新资讯!