题目
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
示例
输入:nums = [5,7,7,8,8,10], target = 8 输出:[3,4]
输入:nums = [5,7,7,8,8,10], target = 6 输出:[-1,-1]
解题思想
二分法的代码模板
public static int binarySearch(int[] nums,int target,int left, int right) {
//这里需要注意,循环条件为小于等于号。当left和right指向的就是我们的目标元素时,left = right 跳出循环
while (left <= right) {
//这里需要注意,计算mid
int mid = left + ((right - left) >> 1);
if (nums[mid] == target) {
return mid;
}else if (nums[mid] < target) {
//这里需要注意,移动左指针。如果不加一,会进入死循环
left = mid + 1;
}else if (nums[mid] > target) {
//这里需要注意,移动右指针。如果不减一,会进入死循环
right = mid - 1;
}
}
//没有找到该元素,返回 -1
return -1;
}
本题使用二分法进行实现。先寻找下边界,当目标值小于等于nums[mid]时,继续在左半部分当中查找,找到第一个数即为下边界。再寻找上边界,目标值大于nums[mid]时,则在右区间继续检索,找到第一个等于目标值的数。
代码实现
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
int left = 0;
int right = nums.size()-1;
int up,down;
//寻找下边界
while(left <= right){
int mid = (left + right)/2;
if(nums[mid] < target){
left = mid + 1;
}else if(nums[mid] >= target){
right = mid - 1;
}
}
down = left;
left = 0;
right = nums.size()-1;
//寻找上边界
while(left <= right){
int mid = (left + right)/2;
if(nums[mid] <= target)
{
left = mid + 1;
}else if(nums[mid] > target){
right = mid - 1;
}
}
up = right;
if(up < down){
up = -1;
down = -1;
}
vector<int> res;
res.push_back(down);
res.push_back(up);
return res;
}
};