标签:start 条件 情况 outline value 二分查找 return 否则 starting
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].
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | class Solution {public: vector<int> searchRange(vector<int>& nums, int target) { return helper(nums, 0, nums.size() - 1, target); } vector<int> helper(vector<int> & nums,int l, int r, int target){ if(nums.empty())return vector<int>{-1,-1}; if(nums[l] == target && target == nums[r]){ return vector<int>{l,r}; } else if(nums[l] <= target && target <= nums[r]){ int mid = (l + r) >> 1; vector<int> L = helper(nums, l, mid, target); vector<int> R = helper(nums, mid+1, r, target); if(L[0] != -1 && R[0] != -1){ return vector<int> {L[0],R[1]}; } else if(L[0] != -1){ return L; } else{// 剩下的 R 不为{-1, -1} 和 R 是{-1, -1}的情况可以合并 return R; } } return vector<int>{-1, -1}; }}; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | class Solution {public: vector<int> searchRange(vector<int>& nums, int target) { if(nums.empty()) return vector<int> {-1, -1}; int l = bs(nums, target); if(nums[l] == target){ int r = bs(nums, target + 1); /** * 当nums的最后一个元素是target的时候,需要将边界r自增才是可以插入target+1的位置 * 比如[2,2,2]则r的值是2,和[2,2,4]的返回值同是2, */ if(nums[r] == target) r++; return vector<int> {l, r - 1}; } else{ return vector<int> {-1, -1}; } } // using binary search to find the first element in nums or the position that could be used to insert the element int bs(vector<int> & nums, int target){ int l = 0, r = nums.size() - 1, mid; while(l < r){ mid = (l + r) >> 1; if(nums[mid] < target){ l = mid + 1; } else{ r = mid; } } return r; }}; |
标签:start 条件 情况 outline value 二分查找 return 否则 starting
原文地址:http://www.cnblogs.com/zhxshseu/p/c8ae187c169beb07f9646be57ee2ec22.html