給定一個按照升序排列的整數數組 nums
,和一個目標值 target
。找出給定目標值在數組中的開始位置和結束位置。算法
你的算法時間複雜度必須是 O(log n) 級別。數組
若是數組中不存在目標值,返回 [-1, -1]
。函數
示例 1:spa
輸入: nums = [5,7,7,8,8,10], target = 8code
輸出: [3,4]blog
示例 2:get
輸入: nums = [5,7,7,8,8,10], target = 6 io
輸出: [-1,-1]class
顯然,這題就是考察lower_bound和upper_bound的,咱們能夠直接用C++提供的函數,也能夠本身寫。di
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; } } };