对排序的数组查找目标值的左右边界。
ex. [5,7,7,8,8,10] , target 8 => [3,4].
思考:对于已经排序的数组,通常会想到二分插入,这道题使用二分查找的变体即可。分别找到左右边界。
int LeftBound(vector<int> &nums, int target) { int begin = 0; int end = nums.size() - 1; // 要有等于:可能是begin和end都指向同一个target位置,也可能指向非值为target的位置 while(begin <= end) { int mid = (begin + end) / 2; if(target == nums[mid]) { if(mid == 0 || target > nums[mid - 1]) return mid; end = mid - 1; } else if(target > nums[mid]) { begin = mid + 1; } else { end = mid - 1; } } return -1; } int RightBound(vector<int> &nums, int target) { int begin = 0; int end = nums.size() - 1; while(begin <= end) { int mid = (begin + end) / 2; if(target == nums[mid]) { if(mid == nums.size() - 1 || target < nums[mid + 1]) return mid; begin = mid + 1; } else if(target > nums[mid]) { begin = mid + 1; } else { end = mid - 1; } } return -1; } vector<int> searchRange(vector<int>& nums, int target) { vector<int> v; v.push_back(LeftBound(nums, target)); v.push_back(RightBound(nums, target)); return v; }