在排序数组中查找元素
/* 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; }