版权声明:此文章为许诗宇所写,如需转载,请写下转载文章的地址 https://blog.csdn.net/xushiyu1996818/article/details/85990786
题目及测试
package pid034;
/*在排序数组中查找元素的第一个和最后一个位置
给定一个按照升序排列的整数数组 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 class main {
public static void main(String[] args) {
int[][] testTable1=new int[][]{{5,7,7,8,8,10},{5,7,7,8,8,10}};
int[] testTable2=new int[]{8,6};
for(int i=0;i<testTable1.length;i++){
test(testTable1[i],testTable2[i]);
}
}
private static void test(int[] ito1, int ito2) {
Solution solution = new Solution();
int[] rtn;
long begin = System.currentTimeMillis();
rtn = solution.searchRange(ito1,ito2);//执行程序
long end = System.currentTimeMillis();
System.out.print(rtn[0]+" "+rtn[1]);
System.out.println();
System.out.println("耗时:" + (end - begin) + "ms");
System.out.println("-------------------");
}
}
解法1(成功,7ms,较快)
使用二分查找的办法,先用二分查找得到target的位置,然后从找到的位置向前和向后寻找相同的target,直到数组边界或者不同,从而得到first和last
如果二分查找找不到(end<begin),则返回-1,-1
package pid034;
import java.util.HashMap;
public class Solution {
public int[] searchRange(int[] nums, int target) {
int length=nums.length;
int[] result=new int[]{-1,-1};
if(length<=0){
return result;
}
int begin=0;
int end=length-1;
int mid=begin/2+end/2;
while(true){
int now=nums[mid];
if(now==target){
break;
}
if(now>target){
end=mid-1;
}
else{
begin=mid+1;
}
mid=(begin+end)/2;
if(end<begin){
return result;
}
}
int first=mid;
int last=mid;
while(first>=0&&nums[first]==target){
first--;
}
first++;
while(last<=length-1&&nums[last]==target){
last++;
}
last--;
result[0]=first;
result[1]=last;
return result;
}
}
其他方法基本与这个差不多,基础就是二分查找