在排序数组中查找元素

/*
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;
}

猜你喜欢

转载自www.cnblogs.com/zhaohuan1996/p/12636287.html