给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
进阶:
你可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗?
示例 1:
输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]
示例 2:
输入:nums = [5,7,7,8,8,10], target = 6
输出:[-1,-1]
示例 3:
输入:nums = [], target = 0
输出:[-1,-1]
提示:
0 <= nums.length <= 105
-109 <= nums[i] <= 109
nums 是一个非递减数组
-109 <= target <= 109
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public int[] searchRange(int[] nums, int target) {
if(nums.length==0) return new int []{-1,-1};
int num1=first(nums,target,0,nums.length-1);
int num2=last(nums,target,0,nums.length-1);
return new int[]{num1,num2};
}
public int first(int nums[],int target,int low,int high){
if(low==high){
if(nums[low]==target) return low;
else return -1;
}
int mid=(low+high)/2;
int left=first(nums,target,low,mid);
int right=first(nums,target,mid+1,high);
if(left==-1&&right==-1) return -1;
else if(left==-1) return right;
else if(right==-1) return left;
else return Math.min(left,right);
}
public int last(int nums[],int target,int low,int high){
if(low==high){
if(nums[low]==target) {
return low;
}
else return -1;
}
int mid=(low+high)/2;
int left=last(nums,target,low,mid);
int right=last(nums,target,mid+1,high);
if(left==-1&&right==-1) return -1;
else if(left==-1) return right;
else if(right==-1) return left;
else return right;
}
}