[34]. 在排序数组中查找元素的第一个和最后一个位置

在排序数组中查找元素的第一个和最后一个位置

 


题目

 


算法设计:二分查找

进行两次二分查找(定制版本),第一次先查找【第一个大于等于target的数】,第二次再查找【第一个大于target的数】。

这题懂二分查找的定制版本即可,关于二分查找的定制版本,请猛击《二分查找的循环不变量》。

  • 【第一个大于等于target的数】就是文中的【大于等于 key 的最小索引】
  • 【第一个大于target的数】就是文中的【查找大于 key 的最小值 upper】
int* searchRange(int* nums, int numsSize, int target, int* returnSize){
    *returnSize = 2;                           // 使用指针传参,得到ans的长度
    int* ans = (int*)malloc(2*sizeof(int));    // 给答案数组ans分配内存
    ans[0] = -1; ans[1] = -1;
    if (numsSize == 0)
        return ans; 
    int left, right, mid;
    left = 0, right = numsSize;         // 第一次搜索【开始位置】,左闭右开
    while(left < right){                // 搜索【第一个大于等于target的数】
        mid = left + ((right-left) >> 1);
        if (nums[mid] < target)
            left = mid+1;
        else
            right = mid;
    }

    if (left == numsSize || nums[left] != target)
        return ans;
    ans[0] = left;
    right = numsSize;                   // 第二次搜索【结束位置】,左闭右开
    while(left < right){                // 搜索【第一个大于target的数】
        mid = left + ((right-left) >> 1);
        if (nums[mid] <= target)
            left = mid+1;
        else
            right = mid;
    }
    ans[1] = left-1;
    return ans;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值