● 题目链接
34. 在排序数组中查找元素的第一个和最后一个位置:https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array/
● 思路:二分法
package day01_extra;
import java.util.Arrays;
/*
34. 在排序数组中查找元素的第一个和最后一个位置
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
示例 1: 示例 2:
输入:nums = [5,7,7,8,8,10], target = 8 输入:nums = [5,7,7,8,8,10], target = 6
输出:[3,4] 输出:[-1,-1]
示例 3:
输入:nums = [], target = 0
输出:[-1,-1]
*/
public class SearchRange {
public static void main(String[] args) {
// test
int[] nums = {5, 7, 7, 8, 8, 10};
int[] result1 = new SearchRange().searchRange(nums, 8);
int[] result2 = new SearchRange().searchRange(nums, 6);
int[] result3 = new SearchRange().searchRange(nums, 0);
System.out.println(Arrays.toString(result1)); // [3, 4]
System.out.println(Arrays.toString(result2)); // [-1, -1]
System.out.println(Arrays.toString(result3)); // [-1, -1]
}
/**
* 在排序数组中查找元素的第一个和最后一个位置
*
* @param nums 升序排列的整数数组
* @param target 目标值
* @return 给定目标值在数组中的开始位置和结束位置 [start,end]
*/
public int[] searchRange(int[] nums, int target) {
// 二分查找目标元素在数组中的索引
int index = binarySearch(nums, target);
// 目标元素不存在
if (index == -1) {
return new int[]{-1, -1};
}
// 目标元素存在
int left = index;
int right = index;
// 分别移动左右指针寻找左右边界
// 寻找左边界
while ((left - 1) >= 0 && (nums[left - 1] == target)) {
left--;
}
// 寻找右边界
while ((right + 1 < nums.length) && (nums[right + 1] == target)) {
right++;
}
return new int[]{left, right};
}
/**
* 二分查找
* ver1:[left,right]左闭右闭区间
*
* @param nums 目标数组
* @param target 目标值
* @return 目标值在数组中的下标,找不到返回-1
*/
public int binarySearch(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
// 左闭右闭区间,left=right是有意义的
while (left <= right) {
int mid = left + (right - left) / 2;
if (target < nums[mid]) {
// 目标值在左半边,更新右边界
right = mid - 1;
} else if (target > nums[mid]) {
// 目标值在右半边,更新左边界
left = mid + 1;
} else if (target == nums[mid]) {
return mid;
}
}
// 未找到
return -1;
}
}