题目描述:
给定一个按照升序排列的整数数组 nums
,和一个目标值 target
。找出给定目标值在数组中的开始位置和结束位置。
你的算法时间复杂度必须是 O(log n) 级别。
如果数组中不存在目标值,返回 [-1, -1]
。
示例 1:
输入: nums = [5,7,7,8,8,10]
, target = 8
输出: [3,4]
示例 2:
输入: nums = [5,7,7,8,8,10]
, target = 6
输出: [-1,-1]
解题思路:
为了达到题目要求的o(log(n))的时间复杂度,写了一堆二分查找,思路是这样的,就是先用二分查找找一下这个数的位置,然后在左边找第一次出现的位置,右边找最后一次出现的位置。
代码实现(Java语言):
class Solution {
public int[] searchRange(int[] nums, int target) {
int sp = binSearch(nums,0,nums.length-1,target);
if(sp == -1){
return new int[]{-1,-1};
}else{
int[] res = new int[2];
res[0] = leftSearch(nums,0,sp,target);
res[1] = rightSearch(nums,sp,nums.length-1,target);
return res;
}
}
public int binSearch(int[] nums,int start,int end,int target){
int i=start,j=end;
while(i <= j){
int mid = (i + j)/2;
System.out.println("mid---" + mid);
if(target == nums[mid]){
return mid;
}else if(target > nums[mid]){
i = mid + 1;
}else{
j = mid - 1;
}
}
return -1;
}
public int leftSearch(int[] nums,int start,int end,int target){
int i=start,j=end;
while(i <= j){
int mid = (i + j)/2;
System.out.println("mid---" + mid);
if(mid == 0&&target == nums[mid])
return mid;
else if(target == nums[mid] && nums[mid-1] != target){
return mid;
}else if(target > nums[mid]){
i = mid + 1;
}else{
j = mid - 1;
}
}
return -1;
}
public int rightSearch(int[] nums,int start,int end,int target){
int i=start,j=end;
while(i <= j){
int mid = (i + j)/2;
System.out.println("mid---" + mid);
if(mid == nums.length-1 && target == nums[mid])
return mid;
if(target == nums[mid] &&nums[mid+1] != target){
return mid;
}else if(target >= nums[mid]){
i = mid + 1;
}else{
j = mid - 1;
}
}
return -1;
}
}