117:Search for a Range
来源:互联网 发布:网络整合营销理论 原则 编辑:程序博客网 时间:2024/05/17 06:51
题目: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; }};
0 0
- 117:Search for a Range
- Search for a Range
- Search for a Range
- Search for a Range
- Search for a Range !!!
- Search for a Range
- Search for a Range
- Search For A Range
- Search for a Range
- Search for a Range
- Search for a Range
- Search for a Range
- Search for a Range
- Search for a Range
- Search for a Range
- Search for a Range
- Search for a Range
- Search for a Range
- web技术栈中不可或缺的Linux技术
- 透彻理解LINUX下TCP的发送缓冲区接收缓冲区与滑动窗口
- sping学习笔记
- ConstraintLayout 的使用
- Vim Editor Assistant
- 117:Search for a Range
- 主动信息收集之端口扫描的一些脚本
- C语言描述:单向链表的相关操作
- MySQL设置主键外键时错误:ERROR 1064 (42000)
- 字符串相关Tips
- LeetCode Week5:Recover Binary Search Tree、Binary Tree Maximum Path Sum
- 人脸识别数据库
- 安装ofsoftswitch13
- 棋盘问题