描述
给定一个包含 n 个整数的排序数组,找出给定目标值 target 的起始和结束位置。
如果目标值不在数组中,则返回[-1, -1]
您在真实的面试中是否遇到过这个题? 是
样例
给出[5, 7, 7, 8, 8, 10]和目标值target=8,
返回[3, 4]
挑战
给定一个包含 n 个整数的排序数组,找出给定目标值 target 的起始和结束位置。
如果目标值不在数组中,则返回[-1, -1]
您在真实的面试中是否遇到过这个题? 是
样例
给出[5, 7, 7, 8, 8, 10]和目标值target=8,
返回[3, 4]
挑战
时间复杂度 O(log n)
分析
个人觉得这道题比较扣边界,需要找到小于target的数,剩下的就是大于等于target的数。对剩下的部分进行比较,返回最后的结果。
这里,二分的时候需要注意,容易出现死循环。
程序
class Solution { public: /** * @param A: an integer sorted array * @param target: an integer to be inserted * @return: a list of length 2, [index1, index2] */ int LowBound(vector<int> &A, int target){//找到可能第一个相等的位置 int left = 0; int right = A.size(); while (left < right) { int mid = left + (right - left)/2; cout << "mid = " << mid << endl; if (A[mid] < target) left = mid + 1; else right = mid; } cout << "left = " << left << endl; return left; } vector<int> searchRange(vector<int> &A, int target) { // write your code here vector<int> result(2, -1); if (A.empty()) return result; int begin = LowBound(A, target); int end = begin; bool signal = false; while (end <= A.size() -1 && A[end] == target) { ++end; signal = true; } if (signal){ result[0] = begin; result[1] = end - 1; } return result; } };