描述
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
你的算法时间复杂度必须是 O(log n) 级别。
如果数组中不存在目标值,返回 [-1, -1]。
例子
思路
要求O(logn),所以只能时二分查找法,先找左边界,再找有右边界。左右边界不可能一个是-1,一个不是
答案
- java
class Solution {
public int[] searchRange(int[] nums, int target) {
int a = get(nums,target,-1);
int b = get(nums,target,1);
return new int[]{a,b};
}
public int get(int[] nums, int target,int flag) {
int low=0, high=nums.length-1,res=-1;
while(low<=high) {
int mid = (low+high)/2;
if(target>nums[mid]) low=mid+1;
if(target<nums[mid]) high=mid-1;
if(target==nums[mid])
{
res = mid;
if(flag==-1) high=mid-1;//找左边界,就缩小右边的范围
else low=mid+1;//找右边界,就缩小左边的范围
}
}
return res;
}
}
- python
class Solution:
def get(self, nums: List[int],target:int,flag:int)->int:
i,j=0,len(nums)-1
res=-1
while i<=j:
mid=(i+j)//2
if nums[mid]<target: i=mid+1
if nums[mid]>target: j=mid-1
if nums[mid]==target:
res=mid
if flag==-1: j=mid-1 #找左边界,就缩小右边的范围
else: i=mid+1#找右边界,就缩小左边的范围
return res
def searchRange(self, nums: List[int], target: int) -> List[int]:
left = self.get(nums, target, -1)
right = self.get(nums, target, 1)
return [left,right]
- c++
class Solution {
public:
int get(vector<int>& nums, int target, int flag)
{
int i=0,j=nums.size()-1,res=-1;
while (i<=j)
{
int mid = (i+j)/2;
if (nums[mid]<target) i=mid+1;
if (nums[mid]>target) j=mid-1;
if (nums[mid]==target)
{
res=mid;
if (flag==-1) j=mid-1; //找左边界,就缩小右边的范围
else i=mid+1; //找右边界,就缩小左边的范围
}
}
return res;
}
vector<int> searchRange(vector<int>& nums, int target) {
int left=get(nums,target,-1);
int right=get(nums,target,1);
return {left, right};
}
};