题目:
给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。
思路:
二分查找分别寻找左边界与右边界,一共有三种情况左闭右闭[left,rigth],左闭右开[left,right),左开右闭(left,right]。
C++源码:
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
if (nums.size() == 0) { //长度为1情况
vector<int> result = { -1,-1 };
return result;
}
if (nums.size() == 2) { //长度为2情况
if (nums[0] == target && nums[1] != target) {
vector<int> result = { 0,0 };
return result;
}
else if (nums[0] == target && nums[1] == target) {
vector<int> result = { 0,1 };
return result;
}
else if (nums[0] != target && nums[1] == target) {
vector<int> result = { 1,1 };
return result;
}
else
{
vector<int> result = { -1,-1 };
return result;
}
}
//寻找区间左边界
int leftBorder = 0;
int left = 0; //起点
int right = nums.size() - 1; //终点
while (left <= right){
int mid = (left + right) / 2;
if (nums[mid] < target) {
left = mid + 1;
}
else {
right = mid - 1;
leftBorder = mid;
}
}
//寻找区间右边界
int rightBorder = nums.size() - 1;
left = 0; //起点
right = nums.size() - 1; //终点
while (left <= right){
int mid = (left + right) / 2;
if (nums[mid] <= target) {
left = mid + 1;
rightBorder = mid;
}
else {
right = mid - 1;
}
}
vector<int> result = {};
//整理输出信息
if (nums[leftBorder] == target && nums[rightBorder] == target) {
result = { leftBorder,rightBorder };
}
else if (nums[leftBorder] == target && nums[rightBorder] != target) {
result = { leftBorder,leftBorder };
}
else if (nums[leftBorder] != target && nums[rightBorder] == target) {
result = { rightBorder,rightBorder };
}
else {
result = { -1,-1 };
}
return result;
}
};