问题描述:
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
你的算法时间复杂度必须是 O(log n) 级别。
如果数组中不存在目标值,返回 [-1, -1]。
示例 1:
输入: nums = [5,7,7,8,8,10], target = 8
输出: [3,4]
示例 2:
输入: nums = [5,7,7,8,8,10], target = 6
输出: [-1,-1]
补充示例3,
输入: nums = [5,7,7,8,9,10], target = 9
输出: [4,4]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
执行结果:
代码描述:
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
vector<int> res(2, -1);
if(nums.size() == 0) return res; // 没有元素,需要特殊处理
if(nums.size() == 1) // 只有一个元素,需要特殊处理
{
if(nums[0] == target)
{
res[0] = 0;
res[1] = 0;
return res;
}
else
return res;
}
int low = 0;
int high = nums.size() - 1;
int mid;
int start; // 标记找到相等元素的第一个索引
bool flag = false; // 用于标记是否找到相等的元素
while(low <= high) // 此循环内套用二分查找找到第一个元素
{
mid = low + (high - low)/2;
if (nums[mid] == target)
{
if (mid == 0 || nums[mid - 1] != target) // 找到第一个相等元素的索引
{
start = mid;
res[0] = start; // 赋值
res[1] = start; // 结尾也要赋值,不然只有一个元素时,会出错。
flag = true;
break;
}
else
{
high = mid - 1;
}
}
else if (nums[mid] > target)
{
high = mid - 1;
}
else
{
low = mid + 1;
}
}
while(flag && start < nums.size() - 1) // 从找到的位置,开始看后面是否有相等元素
{
if(nums[start]==nums[start + 1])
{
++start;
res[1] = start;
}
else
break;
}
return res;
}
};