2025年- H62-Lc170--34.在排序数组中查找元素的第一个和最后一个位置(2次二分查找,标记向左寻找,标记向右寻找)--Java版
1.题目描述
2.思路
3.代码实现
public class H34 {public int[] searchRange(int[] nums, int target) {int start = findFirst(nums, target);int end = findLast(nums, target);return new int[]{start, end};}// 查找第一个出现的位置public int findFirst(int[] nums, int target) {int left = 0;int right = nums.length-1;int res = -1;//“这个值在数组中不存在,没有对应的下标。”默认值返回-1while (left <= right) {int mid = left + (right - left) / 2;if (nums[mid] == target) {res = mid;right = mid - 1;//向右继续查找,你不确定这是不是第一个 8,还可能在它左边还有 8!所以,为了“继续向左边找”,我们要缩小右边界:} else if (target > nums[mid]) {left = mid + 1;} else{right = mid - 1;}}return res;}// 查找最后一个出现的位置public int findLast(int[] nums, int target) {int left = 0;int right = nums.length-1;int res = -1;while (left <= right) {int mid = left + (right - left) / 2;if (nums[mid] == target) {res = mid;//因为这是右边区间,所以我们要往左边找还有没有该元素出现left = mid + 1;} else if (target > nums[mid]) {left = mid + 1;} else {right = mid - 1;}}return res;}public static void main(String[] args){H34 test=new H34();int[] nums={5,7,7,8,8,10};int target=10;int[] res=test.searchRange(nums,target);System.out.print("["+res[0]+","+res[1]+"]");}
}