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、没有找到返回[-1, -1]
2、只存在1个返回[pos, pos]
3、存在多个,返回端点[leftPos, rightPos]
#include <iostream> #include <set> #include <map> #include <vector> #include <sstream> #include <string> #include <algorithm> #include <bitset> using namespace std; class Solution { public: vector<int> searchRange(vector<int>& nums, int target) { vector<int>vec; int leftPos = BinarySearchLeft(nums, target); int rightPos = BinarySearchRight(nums, target); if (nums[leftPos] != target) { vec.push_back(-1); vec.push_back(-1); } else { vec.push_back(leftPos); vec.push_back(rightPos); } return vec; } private: int BinarySearchLeft(vector<int>& nums, int target) { int left = 0; int right = nums.size() - 1; while(left <= right) { int mid = left + ((right - left) >> 1); if (nums[mid] >= target) { right = mid - 1; } else { left = mid + 1; } } return left; } int BinarySearchRight(vector<int>& nums, int target) { int left = 0; int right = nums.size() - 1; while(left <= right) { int mid = left + ((right - left) >> 1); if (nums[mid] > target) { right = mid - 1; } else { left = mid + 1; } } return right; } }; int main() { Solution s; vector<int>vec{0,0,0,1,2,3}; vector<int>v = s.searchRange(vec, 0); for (auto it = v.begin(); it != v.end(); it++) { cout << *it << endl; } return 0; }
看,这个时间,估计得有更高效的算法了。