题目:
Given an array of integers nums
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]
.
Example 1:
Input: nums = [5,7,7,8,8,10]
, target = 8
Output: [3,4]
Example 2:
Input: nums = [5,7,7,8,8,10]
, target = 6
Output: [-1,-1]
题意:
给定一个升序的数组,寻找给定的数值target所在的范围(最前和最后的位置),如果找不到返回[-1,-1]
解法:
先使用二分查找找到一个target数值在的位置,再由该点向周围扩散,找到边缘,返回边缘的前后值。
二分查找没有找到即可返回 [-1,-1]
代码:
class Solution {
public int[] searchRange(int[] nums, int target) {
int pre,last,low=0,high=nums.length-1,mid=0,flag1=0,flag2=0;
int[]res=new int[]{-1,-1};
if(high==-1) return res;
while(low!=high){ //binary search
mid=(low+high)/2;
if(nums[mid]<target){
low=mid+1;
}
else if(nums[mid]>target){
high=mid;
}
else if(nums[mid]==target){
break;
}
}
if(low==high&&nums[low]!=target) return res;
if(low==high&&nums[low]==target) {
res[0]=low;
res[1]=low;
return res;
}
pre=mid;
last=mid;
for(int i=1;i<nums.length;i++){ // search from mid
if(flag1==1&&flag2==1) break;
if((pre-1)>=0&&flag1==0){
if(nums[pre-1]==target) pre--;
else flag1=1;
}
else {
flag1=1;
}
if((last+1)<nums.length&&flag2==0){
if(nums[last+1]==target) last++;
else flag2=1;
}
else{
flag2=1;
}
}
res[0]=pre;
res[1]=last;
return res;
}
}
这次自己code的结果不错 都是 100%,记录一下