先看下最终耗时
非递减顺序排列的整数数组即单调递增数组,可以是这样{1,2,3,4,5,6},也可以是这样{1,1,2,3,4,5,5,5,6}。而这道题找到目标的情况可能有两种,一种是数组中某一个元素,一种是数组中间某一连串的元素。所以我们可以先找到数组中任意一个目标元素,不存在就返回没找到,找到后要对该元素前后判断,看是第一种情况还是第二种情况。如果是第二种我们就要对找到的元素前后遍历,然后返回该一连串相同元素的起始与最后的位置。而快速查找的核心就是使用二分查找法。下面是对该方法的核心代码解释
//定义一个返回前后位置下标的数组,result[0]存第一个目标元素位置result[1]存最后一个
int[] result = new int[2];
//第一步,我们定义3个变量,front代表第一个元素,rear代表最后一个元素,mid代表中间的元素
int front = 0,rear = nums.length - 1,mid = 0;
for(Integer i: nums){ //第二步,循环二分查找
mid = (front + rear) / 2; //将mid指向数组中间的元素
if(target == nums[mid]){ //第三步,若找到目标元素,查看前后是否也是目标元素
result[0] = result[1