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

Posted 2016bits

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了34. 在排序数组中查找元素的第一个和最后一个位置相关的知识,希望对你有一定的参考价值。

一、题目描述

给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。

如果数组中不存在目标值 target,返回 [-1, -1]。

进阶:

你可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗?

二、示例

示例 1:

输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]

示例 2:

输入:nums = [5,7,7,8,8,10], target = 6
输出:[-1,-1]

示例 3:

输入:nums = [], target = 0
输出:[-1,-1]

补充示例 4:

输入:nums = [8,8,8,8], target = 0
输出:[0,3]

补充示例 5:

输入:nums = [1,2,2], target = 2
输出:[1,2]

补充示例 6:

输入:nums = [1,4], target = 4
输出:[0,1]

三、输入输出说明

0 <= nums.length <= 10^5
-10^9 <= nums[i] <= 10^9
nums 是一个非递减数组
-10^9 <= target <= 10^9

四、基本思路

二分法的变形:

1、先用二分法查找target

2、然后在其前半部分查找target的前一个数

3、再在其后半部分查找target的后一个数。

注意编码细节:查找后半部分是从第一个target的下一个位置查找至数组最后一个位置

注意特殊情况:前半部分均为target,即2过程查找失败,此时left=-1,right=0,mid=0,此时target起始位置即为mid;后半部分均为target,即3查找失败,同理,此时target起始位置也为mid

五、代码

class Solution 
public:
    vector<int> searchRange(vector<int>& nums, int target) 
        int len = nums.size();
        if (len == 0) 
            return -1, -1;
        
        int left = 0, right = len - 1, mid;
        while (left <= right) //二分
            mid = (left + right) / 2;
            if (nums[mid] == target) 
                break;
            
            else if (nums[mid] > target) 
                right = mid - 1;
            
            else 
                left = mid + 1;
            
        
        if (left > right) //查找失败
            return -1, -1;
        
        int head = mid, tail = mid;
        left = 0, right = mid - 1;//在前半部分查找target的前一个数
        while (left <= right) 
            mid = (left + right) / 2;
            if (nums[mid] != target && nums[mid+1] == target) 
                head = mid + 1;
                break;
            
            if (nums[mid] < target) //在右半部分继续找
                left = mid + 1;
            
            else 
                right = mid - 1;
            
        
        if (left > right) //前半部分全为target
            head = mid;
        
        left = mid + 1, right = len - 1;//在后半部分查找target的后一个数
        while (left <= right) 
            mid = (left + right) / 2;
            if (nums[mid] != target && nums[mid-1] == target) 
                tail = mid - 1;
                break;
            
            if (nums[mid] > target) //在左半部分继续找
                right = mid - 1;
            
            else 
                left = mid + 1;
            
        
        if (left > right) //后半部分全为target
            tail = mid;
        
        return head, tail;
    
;

 

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

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

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

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

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

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

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