Leetcode__34. 在排序数组中查找元素的第一个和最后一个位置
#题目: Leetcode链接
给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。
# include <iostream>
# include<vector>
using namespace std;
//问:
//怎么去找到最左边的那个?
//mid要大于等于目标时,目标应该在mid的左子区间里面
//那我就让区间的右边等于mid - 1,然后一步一步往左靠,靠的不能在靠就是最左边了。
//核心就是一步一步的往左去靠
int fun_left_Border(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1;
int bleft = -2;
while (left <= right) {
int mid = (left + right) / 2;
if (nums[mid] >= target)
{
right = mid - 1;
bleft = right;
}
else left = mid + 1;
}
return bleft;
}
//右边也是相同的一步一步往右去靠 靠到不能再靠了就停下来,就是最右边了吧
int fun_right_Border(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1;
int bright = -2;
while (left <= right) {
int mid = (left + right) / 2;
if (nums[mid] <= target)
{
left = mid + 1;
bright = left;
}
else right = mid - 1;
}
return bright;
}
vector<int> searchRange(vector<int>& nums, int target){
int leftBorder = fun_left_Border(nums, target);
int rightBorder = fun_right_Border(nums, target);
if (leftBorder ==-2 || rightBorder == -2)
return {-1, -1};
if (rightBorder - leftBorder > 1)
return {leftBorder + 1, rightBorder - 1};
return{ -1,-1 };
}
int main ( ){
vector<int>nums = {5,7,7,8,8,10};
int target = 8;
vector<int>mm = { -2,-2};
mm = searchRange(nums, target);
cout << "[" << mm[0] << "," << mm[1] <<"]"<< endl;
system("pause");
}
//这个程序分三块
//1.找数组中目标的左边界
//2.找数组中目标的有边界
//3.根据返回的左右边界来判断最后的结果