描述
給定一個包含 n 個整數的排序數組,找出給定目標值 target 的起始和結束位置。
如果目標值不在數組中,則返回[-1, -1]
樣例
給出[5, 7, 7, 8, 8, 10]和目標值target=8,
返回[3, 4]
挑戰
時間複雜度 O(log n)
思路
#ifndef C61_H
#define C61_H
#include<iostream>
#include<vector>
using namespace std;
class Solution {
public:
/**
* @param A: an integer sorted array
* @param target: an integer to be inserted
* @return: a list of length 2, [index1, index2]
*/
vector<int> searchRange(vector<int> &A, int target) {
// write your code here
vector<int> res{ -1, -1 };
if (A.empty())
return res;
int left = 0, right = A.size() - 1;
int mid = 0;
//尋找最左邊target
//當mid等於left 或者 mid前一個元素不爲target, mid就是最左邊的target
//如果mid前一個元素依舊是target,就把right置爲mid - 1
while (left <= right)
{
mid = left + (right - left) / 2;
if (A[mid]>target)
right = mid - 1;
else if (A[mid] < target)
left = mid + 1;
else
{
if (mid == left || A[mid - 1] != target)
{
res[0] = mid;
break;
}
else if (A[mid - 1] == target)
{
right = mid - 1;
}
}
}
left = 0, right = A.size() - 1;
//尋找最右邊的target
//當mid等於right 或者 mid的後一個元素不爲target, mid就是最右邊的target
//如果mid的後一個元素認爲target, 把left置爲mid + 1
while (left <= right)
{
mid = left + (right - left) / 2;
if (A[mid]>target)
right = mid - 1;
else if (A[mid] < target)
left = mid + 1;
else
{
if (mid == right || A[mid + 1] != target)
{
res[1] = mid;
break;
}
else if (A[mid + 1] == target)
{
left = mid + 1;
}
}
}
return res;
}
};
#endif