34. 在排序数组中查找元素的第一个和最后一个位置
给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
示例 1:
输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]
示例 2:
输入:nums = [5,7,7,8,8,10], target = 6
输出:[-1,-1]
示例 3:
输入:nums = [], target = 0
输出:[-1,-1]
思路:上篇文章我们使用两个for循环(注意,不是嵌套循环),分别从数组最左边和最右边遍历,得到了目标值的左右边界。我们也可以使用二分法找左右边界。
package leetcode.binarysearch;
import java.util.Arrays;
/**
* 34. 在排序数组中查找元素的第一个和最后一个位置
* 给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
* 如果数组中不存在目标值 target,返回[-1, -1]。
* 原文地址:https://www.codernav.com/2875.html
* 更多算法详解:https://www.codernav.com
*/
public class Q_34_1 {
public static void main(String[] args) {
// 二分.查找
int[] result = f(new int[]{5, 7, 7, 8, 8, 10}, 8);
// int[] result = f(new int[]{1}, 1);
System.out.println(Arrays.toString(result));
}
private static int[] f(int[] nums, int target) {
if (nums.length == 0) {
return new int[]{-1, -1};
}
// 左边界
int left = findBorder(nums, target, true);
// 右边界
int right = findBorder(nums, target, false);
return new int[]{left, right};
}
private static int findBorder(int[] nums, int target, boolean flag) {
int res = -1;
int left = 0;
int right = nums.length - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] > target) {
right = mid - 1;
} else if (nums[mid] < target) {
left = mid + 1;
} else {
res = mid;
// true找左边界 false找右边界
if (flag) {
right = mid - 1; // 往左边找
} else {
left = mid + 1; // 往右边找
}
}
}
return res;
}
}
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...
