Bootstrap

力扣hot100——排序数组中查找元素出现的第一个位置和最后一个位置

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

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

你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。

解题思路:

        // 二分查找 划分左右俩边找

        // 当找到后,左边继续向左边搜,不断更新找到位置就是左边界

        // 同理,右边就是继续向右找,找到右边界

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        // 二分查找 划分左右俩边找
        // 当找到后,左边继续向左边搜,不断更新找到位置就是左边界
        // 同理,右边就是继续向右找,找到右边界
        if(!nums.size()){
            return {-1,-1};
        }
        int left = leftseatch(nums,target);
        int right = rightsearch(nums,target);

        return {left,right};

    }

    int leftseatch(vector<int>& nums, int target){
        int left = 0 , right = nums.size() - 1;
        int res = -1;
        while(left <= right){
            int mid = left + (right - left) / 2;
            if(nums[mid] == target){
                res = mid;
                right = mid - 1;
            }
            else if(nums[mid] < target){
                left = mid + 1;
            }
            else{
                right = mid - 1;
            }
        }
        
        return res;
    }

    int rightsearch(vector<int>& nums, int target){
        int left = 0 , right = nums.size() - 1;
        int res = -1;
        while(left <= right){
            int mid = left + (right - left) / 2;
            if(nums[mid] == target){
                res = mid;
                left = mid + 1;
            }
            else if(nums[mid] < target){
                left = mid + 1;
            }
            else{
                right = mid - 1;
            }
        }
        return res;
    }


};

;