看到时间复杂度要求:O(logn),就知道是折半查找,很简单,先折半查找target的下标,之后向左右找nums[left],nums[right]等于target的下标,返回就行。
class Solution { public int[] searchRange(int[] nums, int target) { int mid=findHalf(nums,target);//找target的下标(只是其中一个下标) if(mid==-1)return new int[]{-1,-1}; int left=mid;//左边界下标 int right=mid;//右边界下标 while(left>0) { if(nums[left-1]==target) { left--; } else { break; } } while(right<nums.length-1)//因为要涉及到下标right+1,所以,right只能到nums.length-1 { if(nums[right+1]==target) { right++; } else { break; } } return new int[]{left,right}; } public int findHalf(int[] nums,int target) { int left=0; int right=nums.length-1; while(left<=right) { int mid=(left+right)/2; if(nums[mid]==target) return mid; else if(nums[mid]<target) { left=mid+1; } else{ right=mid-1; } } return -1; } }