ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

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

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

题型分类:数组中的二分查找

三种情况:

情况一:target在数组范围的右边或者左边,例如数组{3,4,5},target为2或者数组{3,4,5},target为6,此时应该返回{-1,-1}

情况二:target在数组范围中,且数组中不存在target,例如数组{3,6,7},target为5,此时应该返回{-1,-1}

情况三:target在数组范围中,且数组中存在target,例如数组{3,6,7},target为6,此时应该返回{1,1}

class Solution {
public:
    int getRightBorder(vector<int>&nums,int target){
        int left = 0;
        int right = nums.size()-1;
        int rightBorder = -2;
        while(left<=right){
            int middle = left+(right-left)/2;
            if(nums[middle]>target){
                right = middle-1;
            }else{
                left = middle+1;
                rightBorder = left;
            }
        }
        return rightBorder;
    }
    int getLeftBorder(vector<int>&nums,int target){
        int left = 0;
        int right = nums.size()-1;
        int leftBorder = -2;
        while(left<=right){
            int middle = left+(right-left)/2;
            if(nums[middle]>=target){
                right = middle-1;
                leftBorder = right;
            }else{
                left = middle+1;
            }
        }
        return leftBorder;
    }
    vector<int> searchRange(vector<int>& nums, int target) {
        int leftBorder = getLeftBorder(nums,target);
        int rightBorder = getRightBorder(nums,target);
        if(leftBorder == -2 || rightBorder ==-2) return {-1,-1};
        if(rightBorder - leftBorder > 1) return {leftBorder+1,rightBorder-1};
        return {-1,-1};
    }
};
返回列表