1. 程式人生 > 實用技巧 >leetcode116:search-for-a-range

leetcode116:search-for-a-range

題目描述

給出一個有序陣列,請在陣列中找出目標值的起始位置和結束位置 你的演算法的時間複雜度應該在O(log n)之內 如果陣列中不存在目標,返回[-1, -1]. 例如: 給出的陣列是[5, 7, 7, 8, 8, 10],目標值是8, 返回[3, 4].
Given a sorted array of integers, find the starting and ending position of a given target value.

Your algorithm's runtime complexity must be in the order ofO(logn).

If the target is not found in the array, return[-1, -1].

For example,
Given[5, 7, 7, 8, 8, 10]and target value 8,
return[3, 4].


示例1

輸入

複製
[5, 7, 7, 8, 8, 10],8

輸出

複製
[3,4]


class Solution {
public:
/**
*
* @param A int整型一維陣列
* @param n int A陣列長度
* @param target int整型
* @return int整型vector
*/
vector<int> searchRange(int* A, int n, int target) {
// write code here
vector< int> res(2,-1);
if (A==nullptr || n<=0)
return res;
int low=lower_bound(A, A+n, target)-A;
if (low==n || A[low]!=target)
return res;
else res[0]=low;
int high=upper_bound(A, A+n,target)-A-1;
res[1]=high;
return res;

}
};

class Solution {
public:
/**
*
* @param A int整型一維陣列
* @param n int A陣列長度
* @param target int整型
* @return int整型vector
*/
vector<int> searchRange(int* A, int n, int target) {
// write code here
vector<int> res(2,-1);
if (A==nullptr || n<=0)
return res;
int low=0,high=n-1;
while (low<=high)
{
int middle =(high+low)>>1;
if (A[middle]<target)
low=middle+1;
else
high=middle-1;

}
int low2=0,high2=n-1;
while (low2<=high2)
{
int middle2=(high2+low2)>>1;
if (A[middle2]<=target)
low2=middle2+1;
else
high2=middle2-1;

}
if (low<=high2){
res[0]=low;
res[1]=high2;

}
return res;
}

};