leetcode刷题记录——数组二分查找

这篇博客讨论了一个使用二分查找算法在非递减有序数组中寻找目标值开始和结束位置的问题。代码展示了一种解决方案,通过在找到目标值后分别向两侧扩展来确定边界。算法的时间复杂度为O(logn)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

class Solution{

public:
    vector<int> searchRange(vector<int>& nums, int target){
        int left=0;
        int right=nums.size()-1;
        while(left<=right){
            int middle=left+(right-left)/2;
            if (nums[middle]>target){
                right=middle-1;
            }
            eise if (nums[middle]<target){
                left=middle+1;
            }
            else{
                left=right=middle;   //这个条件下就是存在目标值,然后将左右重新往两边搜索寻找边界值 
                while(left>=0 && nums[left]==target){
                    left--;
                }
                while(right<=nums.size()-1 && nums[right]==target){
                    right++;
                }
                return vector<int>{left+1,right-1};
            }
        }
        return vector<int>{-1,-1};

    }
};

题目:

给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]

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

第一个循环:while(left<=right),即左边和右边的标签值是可以相等的,对应去[left,right],即左右值都在取值范围内。

正是因为左右值都需要取到,因此当大于和小于的情况下,需要加一和减一,即把中间值不等于目标值的部分分隔开。

重点是在第三部分,取else时,nums[middle]==target,我采用的解法是最为直观的,将左右标签赋值为middle,然后分别往两边搜索,条件是取值仍然要为目标值。

最后取得的left和right值,已经是不符合条件的了,因此最后要重新加上1和减去1。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值