Given a sorted array of integers, 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]
.
第一次提交代码:
public int[] searchRange(int[] nums, int target) {
int len = nums.length;
int result[] = new int[2];
if(len==0 || nums[0]>target || nums[len-1]<target){//判断目标是否在数组中
result[0]=-1;
result[1]=-1;
}else{
int high = nums.length-1;
int low = 0;
int mid = 0;
boolean flag = false;
while(low<high){ //先用二分查找到一个符合的下标
flag = true;
mid=low + (high-low)/2;
if(nums[mid]<target){
low = mid+1;
}else {
high = mid;
}
}
System.out.println("low "+low);
result[0]=low;
int i=low;
for(;i<nums.length && nums[i]==target ;i++){
}
if(low==i){
result[0]=-1;
result[1]=-1;
}else{
result[1]=i-1;
}
}
return result;
}
整理之后再次提交:
public int[] searchRange2(int[] nums, int target) {
int len = nums.length;
int result[] = new int[2];
int high = nums.length-1;
int low = 0;
int mid = 0;
boolean flag = false;
while(low<high){ //先用二分查找到一个符合的下标
flag = true;
mid=low + (high-low)/2;
if(nums[mid]<target){
low = mid+1;
}else {
high = mid;
}
}
System.out.println("low "+low);
if(low>len || nums[low]!=target){
result[0]=-1;
result[1]=-1;
}
else{
result[0]=low;
int i=low;
for(;i<nums.length && nums[i]==target ;i++){
}
result[1]=i-1;
}
return result;
}
做这道题目发现,在提交之前要想清楚边界条件,脑子永远比蛮力重要多。
方法三:分别求出其出现的上界和下界。
public int[] searchRange3(int[] nums, int target) {
int[] res = new int[2];
res[0] = lowerbound(nums, target);
res[1] = upperbound(nums, target);
return res;
}
int lowerbound(int[] nums, int target) {// 找相等的下界
int high = nums.length-1;
int low = 0;
int mid = 0;
while(low<high){
mid=low + (high-low)/2;
if(nums[mid]<target){
low = mid+1;
}else {
high = mid;
}
}
return nums[low] == target ? low : -1; //这样就避免了溢出
}
int upperbound(int[] nums, int target) { // 找关键字在数组中出现的上界
int high = nums.length - 1;
int low = 0;
int mid = 0;
while (low < high) {
mid = low + (high - low + 1) / 2;
if (nums[mid] <= target) {
low = mid;
} else {
high = mid - 1;
}
}
return nums[low] == target ? low : -1; //这样就避免了溢出
}