LeetCode 34. Search for a Range

本文介绍了一种在有序整数数组中寻找特定目标值起始和结束位置的方法,并通过两次二分查找来实现O(logn)的时间复杂度。首先寻找左边界,再基于左边界寻找右边界。

Given an array of integers sorted in ascending order, find the starting and ending position of a given target value.

Your algorithm’s runtime complexity must be in the order of O(log n).

If the target is not found in the array, return [-1, -1].

For example,
Given [5, 7, 7, 8, 8, 10] and target value 8,
return [3, 4].

这道题让我们在一个有序整数数组中寻找相同目标值的起始和结束位置,而且限定了时间复杂度为O(logn)。

使用两次二分查找分别寻找左右边界。
1.寻找左边界
搜索范围的左右边界下表分别为low、high,每一次迭代中,中间数下表mid=(low+high)/2,根据二分搜索一般的做法,要比较nums[mid]和target,由于是要找目标值的左边界:
- nums[mid] < target,左边界必定在mid右边,所以low = mid+1。
- nums[mid] > target,左边界必定在mid左边,所以high = mid-1。
- nums[mid] = target ,左边界可能在mid左边也可能就是mid,high = mid。
第二种和第三种情况可以合并为high = mid,当迭代至low = high时,查找到的(low/high)就是最有可能是左边界的地方,这是我们还要检查一下这个值是否等于target。若不等,说明左边界不存在也即所找目标值不存在。

2.寻找右边界
如果第一步目标值左边界是存在的,那么直接用找到的目标值左边界作为搜索范围的左边界。我们可以使用和寻找左边界时类似的做法。
- nums[mid] < target,右边界必定在mid右边,所以low = mid + 1。
- nums[mid] > target,右边界必定在mid左边,所以high = mid - 1。
- nums[mid] = target,右边界可能在mid右边也可能就是mid,low = mid。
第一第三种情况可以合并为low = mid,但此时mid=(low+high+1)/2。
原因:mid = (low+high)/2,计算得到mid一定会偏向于low一边。会有这么一个情况,当迭代至low和high相邻时(值只差1),mid = low,若nums[mid] = target,则下一次迭代的low = mid,这会导致一直跳不出迭代循环。由于mid = (low+high)/2偏向low一边导致搜索范围无法移动,所以我们要找到一个方法令low != mid。
令mid偏向于high就可以让搜索范围一直移动了。

ps:在寻找左边界时,mid = (low+high)/2恰巧可以满足搜索需要。

vector<int> searchRange(vector<int>& nums, int target) {
        vector<int> temp{ -1,-1 };

        if (nums.size() == 0) return temp;

        int low = 0, high = nums.size() - 1, mid;

        while (low < high)
        {
            mid = (low + high) / 2;
            if (nums[mid] < target) low = mid + 1;
            else high = mid;
        }
        if (nums[low] != target) return temp;
        else temp[0] = low;

        high = nums.size() - 1;
        while (low < high)
        {
            mid = (low + high) / 2 +1;
            if (nums[mid] > target) high = mid - 1;
            else low = mid;
        }
        if (nums[low] != target) return temp;
        else temp[1] = low;

        return temp;
    }
### LeetCode Problem 34: Find First and Last Position of Element in Sorted Array The task involves finding the starting and ending position of a given target value within an array of integers. If the target is not found in the array, [-1, -1] should be returned. For instance, consider an input where `nums` = [5,7,7,8,8,10], and `target` = 8. The expected output would be [3, 4]. Another example could involve `nums` = [5,7,7,8,8,10], but this time with `target` = 6, leading to an output of [-1, -1]. To solve this problem efficiently: A binary search approach can achieve logarithmic complexity by narrowing down potential positions for both the first and last occurrence of the target element[^1]: ```python def searchRange(nums, target): def findLeftIndex(nums, target): left, right = 0, len(nums) - 1 while left <= right: mid = (left + right) // 2 if nums[mid] < target: left = mid + 1 else: right = mid - 1 return left def findRightIndex(nums, target): left, right = 0, len(nums) - 1 while left <= right: mid = (left + right) // 2 if nums[mid] <= target: left = mid + 1 else: right = mid - 1 return right left_index = findLeftIndex(nums, target) right_index = findRightIndex(nums, target) # Check if the target exists in the list. if left_index <= right_index < len(nums) and nums[left_index] == target: return [left_index, right_index] return [-1, -1] ``` This code snippet defines two helper functions that perform modified versions of binary searches—one looking for the start index (`findLeftIndex`) and another for the end index (`findRightIndex`). After determining these indices, it checks whether they are valid before returning them as part of the result.
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值