classSolution { publicint[] searchRange(int[] nums, int target) { int n=nums.length; int result[]={-1,-1}; //特殊情况处理 if (n==0){ return result; } int firstPosition=findFirstPosition(nums,target); //如果第一个元素没有找到,说明没有这个元素 直接返回 if (firstPosition==-1){ return result; } int lastPosition=findLastPosition(nums,target); result[0]=firstPosition; result[1]=lastPosition; return result; }
privateintfindFirstPosition(int[] nums, int target) { //这个方法可以看做是找target 但是找到是最左边的数 int left=0; int right=nums.length-1; while (left<right){ int mid=(left+right)/2; //1.mid及其左边的元素都不符合 if (nums[mid]<target){ left=mid+1; } //2.mid右边的元素肯定不是第一个出现的mid! //这里虽然找到了目标值,但是不知道是不是最左边的,保险起见让它为右边界继续找 elseif (nums[mid]==target){ right=mid; } else { //num[mid]>target ,mid及其右边的元素肯定不是 right=mid-1; } } //最后看有没有找到目标值 if (nums[left]==target){ return left; } return -1; }
privateintfindLastPosition(int[] nums, int target) { //这个方法可以看做是找target 但是找到是最右边的数 int left=0; int right=nums.length-1; while (left<right){ int mid=(left+right+1)/2; //这里要注意要向上取整,因为有left=mid和left=mid+1,可能会导致死循环 //1.mid及其左边的元素都不符合 if (nums[mid]<target){ //下一轮为[mid+1,right] left=mid+1; } //2.mid左边的元素肯定不是最后一个出现的mid! //类比同上 elseif (nums[mid]==target){ //下一轮为[mid,right] left=mid; } else { //num[mid]>target ,mid及其右边的元素肯定不是 //下一轮为[left,mid-1] right=mid-1; } } //最后看有没有找到目标值 //这里其实已经没有必要找了因为firstPosition已经判断过了 //不过可以作为一个单独的函数来看,就把条件加上了 if (nums[left]==target){ return left; } return -1; } }
publicintsearch(int[] nums, int target) { int left; int right; while (left<right){ //[l,r]->[l,m]&&[m+1,r] int mid=(left+right)/2; if (nums[mid]==target){ return target; } elseif (nums[mid]<target){ left=mid+1; }elseif (nums[mid]>target){ right=mid; } } }