给定一个按照升序排列的整数数组 nums
,和一个目标值 target
。找出给定目标值在数组中的开始位置和结束位置。
你的算法时间复杂度必须是 O(log n) 级别。
如果数组中不存在目标值,返回 [-1, -1]
。
输入: nums = [5,7,7,8,8,10], target = 8 输出: [3,4]
方法一:递归法
思路:与33的思想类似
【1】找到中间结点并与target比较大小。
【2】若小于target,则在后半部分查找。大于target,则在前半部分查找。
【3】若等于target,比较最小值下标,最大值下标。由于不知道前后是否还有等于target的数,两边一起找。
int minIndex, maxIndex;
//递归归并排序
void dpMergeSort(vector<int>& nums, int begin, int end, int target) {
if (begin <= end) {
int mid = (begin + end) / 2;
if (nums[mid] == target) {
minIndex = minIndex < mid ? minIndex : mid;
maxIndex = maxIndex > mid ? maxIndex : mid;
//中间数相等,不知道左右两边是否还有target所以两边遍历
dpMergeSort(nums, begin, mid - 1, target);
dpMergeSort(nums, mid + 1, end, target);
}
else if (nums[mid] < target) {
dpMergeSort(nums, mid + 1, end, target);
}
else {
dpMergeSort(nums, begin, mid - 1, target);
}
}
}
vector<int> searchRange(vector<int>& nums, int target) {
vector<int> vec;
minIndex = nums.size(), maxIndex = -1;
dpMergeSort(nums, 0, nums.size() - 1, target);
if (minIndex == nums.size()) {
minIndex = -1;
}
vec.push_back(minIndex);
vec.push_back(maxIndex);
return vec;
}