问题
给定一个有序数组和一个目标值,找出该目标值在这个数组里面的区域,若目标不存在于数组中,返回[-1, -1];
例如:有序数组 1 2 3 4 5 6 6 6 6 给出目标值6,应当返回[5, 8] ;
要求:时间复杂度O(Llogn)。
思路
看到有序数组和时间复杂度O(logn)时,第一反应就是二分查找。
1.先二分查找出第一个与目标值相等的位置;
2.在(1)的基础上向左边搜索得出区域的左边范围,同样是二分法;
3.在(1)的基础上向右边搜索得出区域的右边范围。
代码
#include <iostream>
using namespace std;
// O(logn)
// 参数:arr有序数组,ans计算值,target目标,length数组长度
void targetRange(int* arr, int* ans, int target, int length){
ans[0] = ans[1] = -1;
// 搜索起点、中点、终点
int start = 0;
int end = length;
int pix = length/2;
// 二分找到相同值
while(arr[pix]!