Leetcode 704. 二分查找(简单) 34. 在排序数组中查找元素的第一个和最后一个位置(中等) 二分查找以及边界查找

labuladong解法

704. 二分查找(简单)

题目:

二分查找

思路:

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

 

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

题目:

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

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

进阶:

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

示例 1:

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

思路:

查找相同元素的左右边界。只需要在原本二分查找的基础上改变等于target时的策略

对于左边界,等于target时不断缩减right,然后返回left

对于右边界,等于target时不断缩减left,然后返回right

注意返回时要先进行判定其是否越界或是否等于target

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        int leftbound=searchRangeLeft(nums,target);
        int rightbound=searchRangeRight(nums,target);
        return {leftbound,rightbound};
    }
    int searchRangeLeft(vector<int>& nums, int target){
        int left=0,right=nums.size()-1;
        while(left<=right){
            int mid=left+(right-left)/2;
            if(nums[mid]<target)
                left=mid+1;
            else if(nums[mid]>target)
                right=mid-1;
            else if(nums[mid]==target)
                right=mid-1;// 别返回,锁定左侧边界
        }
        // 最后要检查 left 越界的情况
        if(left>=nums.size()||nums[left]!=target)
            return -1;
        return left;
    }
    int searchRangeRight(vector<int>& nums, int target){
        int left=0,right=nums.size()-1;
        while(left<=right){
            int mid=left+(right-left)/2;
            if(nums[mid]<target)
                left=mid+1;
            else if(nums[mid]>target)
                right=mid-1;
            else if(nums[mid]==target)
                left=mid+1;// 别返回,锁定右侧边界
        }
        // 最后要检查 right 越界的情况
        if(right<0||nums[right]!=target)
            return -1;
        return right;
    }
};

 

posted @ 2022-02-26 23:12  鸭子船长  阅读(32)  评论(0编辑  收藏  举报