![]()
/*
34.在排序数组中查找元素的第一个和最后一个位置。
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
你的算法时间复杂度必须是 O(log n) 级别。
如果数组中不存在目标值,返回 [-1, -1]。
*/
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include <iostream>
/*寻找左侧边界*/
int left_bound(int* nums, int numsSize,int target) {
int left=0,right=numsSize-1,mid;
while(left<=right){
mid=left+(right-left)/2;
if(nums[mid]==target){
//别返回,收缩边界
right=mid-1;
}else if(nums[mid]<=target){
left=mid+1;
}else{
right=mid-1;
}
}
if(left>=numsSize||nums[left]!=target)
return -1;
return left;
}
/*寻找右侧边界*/
int right_bound(int* nums, int numsSize, int target) {
int left=0,right=numsSize-1,mid;
while(left<=right){
mid=left+(right-left)/2;
if(nums[mid]==target){
//别返回,收缩边界
left=mid+1;
}else if(nums[mid]<=target){
left=mid+1;
}else{
right=mid-1;
}
}
if(right<0||nums[right]!=target)
return -1;
return left-1;
}
int* searchRange(int* nums, int numsSize, int target, int* returnSize){
int *rs,left,right;
rs=(int*)malloc(sizeof(int)*2);
rs[0]=-1;
rs[1]=-1;
*returnSize=2;
left = left_bound(nums,numsSize,target);
right = right_bound(nums,numsSize,target);
rs[0]=left;
rs[1]=right;
return rs;
}
int main()
{
int nums[]={5,7,7,8,8,10},target=8;
int *returnSize=(int*)malloc(sizeof(int));
int *rs=searchRange(nums,6,target,returnSize);
int k=*returnSize,i;
for(i=0;i<k;i++){
printf("%d ",rs[i]);
}
return 0;
}