-
题目:34.在排序数组中查找元素的第一个和最后一个位置
给定一个按照升序排列的整数数组 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] -
思路:见代码中的注解哦
public int[] searchRange2(int[] nums, int target){
int s=find(nums,target);
if(s==nums.length||nums[s]!=target){
return new int[]{-1,-1};
}
int e=find(nums,target+1)-1;
if(e==nums.length||nums[e]!=target){
return new int[]{-1,-1};
}
return new int[]{s,e};
}
/*
* 二分查找变形
* 该算法实现的是找到数组中,与target相同的数字的最左边的位置,如果没有于target相同的数字,那么就找大于()target-1)的最后端的位置
* 挺不好理解的,只能是调试去理解~
* */
private int find(int[] nums, int target){
int s=0;
int e=nums.length;//注意这里不能是nums.length-1哦,挺不好理解的,只能是调试去理解~
while (s<e){
int middle=s+(e-s)/2;
if(nums[middle]>=target){
e=middle;
}else{
s=middle+1;
}
}
return s;
}