一、问题描述
Given an array of integers sorted in ascending order, find the starting and ending position of a given target value.
Your algorithm's runtime complexity must be in the order of O(log n).
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]
.
二、问题思路
求解数组nums中值为target的起始位置和终点位置,nums数组是从小到大排过序的数组。
本人思路是利用二元搜索去寻找数组中值为target的索引值,然后从该索引位置向左右两边扩散,去寻找起始位置和终点位置
三、代码
本人代码
public class Solution {
public int[] searchRange(int[] nums, int target) {
if(nums==null || nums.length<=0)
return new int[]{-1,-1};
int start=0;
int end=nums.length-1;
while(start<end){
int middle=(start+end)/2;//这里最好写成int middle=start+(end-start)/2避免int溢出
if(nums[middle]==target){
return findRange(nums,middle,target);
}else if(nums[middle]>target){
end=middle;
}else{
start=middle+1;
}
}
if(nums[start]==target){
return findRange(nums,start,target);
}
return new int[]{-1,-1};
}
private int[] findRange(int[] nums,int point,int target){
int i=point;
int j=point;
while(i>0){
if(nums[i-1]==target){
i--;
}else
{
break;
}
}
while(j<nums.length-1){
if(nums[j+1]==target){
j++;
}else{
break;
}
}
if(i==j){
return new int[]{i,i};
}
return new int[]{i,j};
}
}
2.LeetCode论坛里提供了另外一种解法,利用二元检索去查找目标值的起始位置和终点位置https://discuss.leetcode.com/topic/5891/clean-iterative-solution-with-two-binary-searches-with-explanation
public class Solution {
public int[] searchRange(int[] nums, int target) {
int [] result=new int[]{-1,-1};
if(nums==null || nums.length<=0)
return result;
int start=0;
int end=nums.length-1;
while(start<end){
int middle=start+(end-start)/2;
if(nums[middle]<target)
start=middle+1;
else
end=middle;
}
if(nums[start]!=target)
return result;
result[0]=start;
start=0;
end=nums.length-1;
while(start<end){
int middle=start+(end-start)/2+1;
if(nums[middle]>target)
end=middle-1;
else
start=middle;
}
result[1]=end;
return result;
}
}