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

Posted Debroon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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;

以上是关于[34]. 在排序数组中查找元素的第一个和最后一个位置的主要内容,如果未能解决你的问题,请参考以下文章

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

算法leetcode|34. 在排序数组中查找元素的第一个和最后一个位置(rust重拳出击)

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

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

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

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