给定一个按照升序排列的整数数组 nums
,和一个目标值 target
。找出给定目标值在数组中的开始位置和结束位置。
你的算法时间复杂度必须是 O(log n) 级别。
如果数组中不存在目标值,返回 [-1, -1]
。
示例 1:
输入: nums = [5,7,7,8,8,10], target = 8
输出: [3,4]
示例 2:
输入: nums = [5,7,7,8,8,10], target = 6
输出: [-1,-1]
显然,这题就是考察lower_bound和upper_bound的,我们可以直接用C++提供的函数,也可以自己写。
AC代码:
class Solution { public: vector<int> searchRange(vector<int>& nums, int target) { vector<int> res; int l=lower_bound(nums.begin(),nums.end(),target)-nums.begin(); int r=upper_bound(nums.begin(),nums.end(),target)-nums.begin()-1; if(l<=r && 0<=l && r<nums.size()) { res.push_back(l), res.push_back(r); return res; } else { res.push_back(-1), res.push_back(-1); return res; } } };
int lower(const vector<int> &a,int x) { int l=0, r=a.size(); while(l<r) { int mid=(l+r)/2; if(a[mid]<x) l=mid+1; else r=mid; } return l; } int upper(const vector<int> &a,int x) { int l=0, r=a.size(); while(l<r) { int mid=(l+r)/2; if(a[mid]<=x) l=mid+1; else r=mid; } return l; } class Solution { public: vector<int> searchRange(vector<int>& nums, int target) { vector<int> res; int l=lower(nums,target); int r=upper(nums,target)-1; if(l<=r && 0<=l && r<nums.size()) { res.push_back(l), res.push_back(r); return res; } else { res.push_back(-1), res.push_back(-1); return res; } } };