117:Search for a Range

本文介绍了一种算法,可以在已排序的整数数组中找到给定目标值的起始和结束位置,采用C++ STL提供的lower_bound和upper_bound函数实现,确保了O(logn)的时间复杂度。

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

题目:Given a sorted array of integers, 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].

解析1:我们可以使用 c++ STL 提供的 lower_bound 和 upper_bound 函数来求解这个问题。

代码如下:

// 使用 STL 中提供的 lower_bound 和 upper_bound 函数
// upper_bound 返回一个迭代器,指向[first, last) 中第一个大于 target 的元素
// lower_bound 返回一个迭代器,指向[first, last) 中打一个大于等于 target 的元素
// 因此如果 tagret 在 [first, last) 范围内不存在
// 则 lower_bound 与 upper_bound 应返回相同的迭代器
// 时间复杂度为 O(logn)
class Solution {
public:
        vector<int> searchRange(vector<int>& nums, int target) {
                auto lower = lower_bound(nums.begin(), nums.end(), target);
                auto upper = upper_bound(lower, nums.end(), target);

                // target 在数组 nums 中不存在
                if (lower == upper) return vector<int>{-1, -1};

                // target 在数组 nums 中存在
                const int l = distance(nums.begin(), lower);
                const int u = distance(nums.begin(), prev(upper));
                return vector<int>{l, u};
        }
};

解析2:我们可以自己写代码实现 lower_bound 和 upper_bound 函数,代码如下:

// 不借助于 STL,自己实现 lower_bound 和 upper_bound
// 时间复杂度 O(logn),空间复杂度 O(1)
class Solution {
public:
        vector<int> searchRange(vector<int>& nums, int target) {
                auto lower = lower_bound(nums.begin(), nums.end(), target);
                auto upper = upper_bound(lower, nums.end(), target);

                // target 在数组 nums 中不存在
                if (lower == upper) return vector<int>{-1, -1};

                // target 在数组 nums 中存在
                const int l = distance(nums.begin(), lower);
                const int u = distance(nums.begin(), prev(upper));
                return vector<int>{l, u};
        }
private:
        template<class ForwardIterator, class T>
        ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last, T target) {
                while (first != last) {
                        size_t len = last - first;
                        auto mid = next(first, len / 2);
                        if (*mid < target) first = ++mid;
                        else last = mid;
                }
                return first;
        }

        template <class ForwardIterator, class T>
        ForwardIterator upper_bound(ForwardIterator first, ForwardIterator last, T target) {
                while (first != last) {
                        size_t len = last - first;
                        auto mid = next(first, len / 2);
                        if (*mid <= target) first = ++mid;
                        else last = mid;
                }
                return first;
        }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值