这题一看:升序、时间复杂度的要求:O(log n),就有思路了:典型的二分查找嘛!
先用二分查找找到target所在下标,考虑到target重复的情况,定义左右两个指针,他们同时从找到的下标位置出发,一个向左,一个向右,直到找到不等于target的下标位置即可
1 public static int[] searchRange(int[] nums, int target) { 2 //排除特殊数据:数组为空,长度为0、1 3 if (nums == null || nums.length == 0) { 4 return new int[]{-1, -1}; 5 } 6 if (nums.length == 1) { 7 if (nums[0] == target) { 8 return new int[]{0, 0}; 9 } else { 10 return new int[]{-1, -1}; 11 } 12 } 13 //排除完毕,开始二分查找,index是查找结果,flag标记是否查找成功,默认false 14 int low = 0, high = nums.length - 1; 15 int index = 0; 16 boolean flag = false; 17 while (low <= high) { 18 int mid = (low + high) / 2; 19 if (target == nums[mid]) { 20 index = mid; 21 flag = true; 22 break; 23 } else if (target > nums[mid]) { 24 low = mid + 1; 25 } else { 26 high = mid - 1; 27 } 28 } 29 //没有找到target 30 if (flag == false) { 31 return new int[]{-1, -1}; 32 } 33 //以target的下标index为中心,向左,向右分别遍历,找到边界 34 int left = index - 1, right = index + 1; 35 while (left >= 0 && nums[left] == target) { 36 left--; 37 } 38 while (right < nums.length && nums[right] == target) { 39 right++; 40 } 41 return new int[]{left + 1, right - 1}; 42 }
运行结果: