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

版权声明: https://blog.csdn.net/Dorothy_Xue/article/details/83958324

题目描述:

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

你的算法时间复杂度必须是 O(log n) 级别。

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

示例 1:

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

示例 2:

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

方法:二分搜索

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        vector<int> res;
        res.push_back(-1);
        res.push_back(-1);
        if(nums.size()==0) return res;
        if(nums.size()==1){
            if(nums[0]==target){
                res.clear();
                res.push_back(0);
                res.push_back(0);
                return res;
            }
        }
        int mid,low=0,high=nums.size()-1;
        int min=nums.size(),max=-1;
        
        while(low<=high){
            mid=(low+high)/2;
            if(nums[mid]<target) low=mid+1;
            if(nums[mid]>target) high=mid-1;
            if(nums[mid]==target){
                if(mid<min) min=mid;
                if(mid>max) max=mid;
                low++;
            }
        }

        low=0,high=nums.size()-1;
        while(low<=high){
            mid=(low+high)/2;
            if(nums[mid]<target) low=mid+1;
            if(nums[mid]>target) high=mid-1;
            if(nums[mid]==target){
                if(mid<min) min=mid;
                if(mid>max) max=mid;
                high--;
            }
        }
        
        if(nums[mid]!=target) return res;
        res.clear();
        res.push_back(min);
        res.push_back(max);
        return res;
    }
};

思路: 

文章中要求复杂度log(n),所以还是用二分法。

这个题要搜索的数字与常规二分不一样的是,这里的数字可能会有重复,所以只要将常规二分搜索的截止条件nums[mid]==target;break; 换掉就可以了。

因为符合条件的数字可能不止一个,但它们肯定分布在搜索到的位置的两边,所以在找到目标值所在的位置后,还要继续进行搜索,不可以break。因为可能分布在两边,所有可以将low++,或者high--,二者都要进行,这样才能找全。

猜你喜欢

转载自blog.csdn.net/Dorothy_Xue/article/details/83958324