/** * @author shixuesen * @date 2023/6/18 */ public class Solution0034 { public int[] searchRange(int[] nums, int target) { // 二分法查找,但是尝试用两个数绑定作为一个元素 if (nums.length == 0) { return new int[]{-1, -1}; } if (nums.length == 1 && nums[0] == target) { return new int[]{0, 0}; } int left = 0, right = nums.length - 1; int leftIndex = -1, rightIndex = -1; while (left <= right) { int mid = left + (right - left) / 2; if (nums[mid] == target) { int subLeftIndex = - 1; int subRightIndex = -1; if (left <= mid - 1) { subLeftIndex = findLeftIndex(nums, target, left, mid - 1); } if (mid + 1 <= right) { subRightIndex = findRightIndex(nums, target, mid + 1, right); } if (subLeftIndex > -1 && subLeftIndex < mid) { leftIndex = subLeftIndex; } else { leftIndex = mid; } if (subRightIndex > -1 && subRightIndex > mid) { rightIndex = subRightIndex; } else { rightIndex = mid; } return new int[]{leftIndex, rightIndex}; } else if (nums[mid] < target) { left = mid + 1; } else { right = mid - 1; } } // if (leftIndex == -1) { // return new int[]{-1, -1}; // } return new int[]{-1, -1}; } public int findLeftIndex(int[] nums, int target, int left, int right) { int mid = left + (right - left) / 2; int leftIndex = -1; int currentLeftIndex = -1; if (nums[mid] == target) { leftIndex = mid; if (leftIndex > 0) { if (nums[leftIndex - 1] < target) { return leftIndex; } else { currentLeftIndex = findLeftIndex(nums, target, left, mid - 1); if (currentLeftIndex != -1 && currentLeftIndex < leftIndex) { leftIndex = currentLeftIndex; } } } else { return leftIndex; } } else if (nums[mid] < target && left < right) { return findLeftIndex(nums, target, mid + 1, right); } else if (left < right){ return findLeftIndex(nums, target, left, mid - 1); } else { return leftIndex; } return leftIndex; } public int findRightIndex(int[] nums, int target, int left, int right) { int mid = left + (right - left) / 2; int rightIndex = -1; int currentRightIndex = -1; if (nums[mid] == target) { rightIndex = mid; if (rightIndex < nums.length - 1) { if (nums[rightIndex + 1] > target) { return rightIndex; } else { if (mid < right) { currentRightIndex = findRightIndex(nums, target, mid + 1, right); if (currentRightIndex != -1 && currentRightIndex > rightIndex) { rightIndex = currentRightIndex; } } else { return rightIndex; } } } else { return rightIndex; } } else if (nums[mid] < target && left < right && mid < right) { return findRightIndex(nums, target, mid + 1, right); } else if (left < right && mid > 0){ return findRightIndex(nums, target, left, mid - 1); } else { return rightIndex; } return rightIndex; } public static void main(String[] args) { int[] nums = new int[] {1,4}; int target = 4; int left = 0; int right = nums.length - 1; Solution0034 solution0034 = new Solution0034(); int[] res = solution0034.searchRange(nums, target); System.out.println(res[0]); System.out.println(res[1]); } }