首页 > 编程语言 > 详细

在排序数组中查找元素

时间:2020-04-05 12:01:41      阅读:73      评论:0      收藏:0      [点我收藏+]

技术分享图片

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

 

在排序数组中查找元素

原文:https://www.cnblogs.com/zhaohuan1996/p/12636287.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!