题目:
给你一个按照非递减顺序排列的整数数组
nums
,和一个目标值target
。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值
target
,返回[-1, -1]
。你必须设计并实现时间复杂度为
O(log n)
的算法解决此问题。示例 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]
提示:
0 <= nums.length <= 105
-109 <= nums[i] <= 109
nums
是一个非递减数组-109 <= target <= 109
解题思路:
特殊情况,当该元素不存在时,返回 [-1,-1]
1、通过JavaAPI判断元素是否存在
Arrays.binarySearch(nums,target)
- 当元素存在 : 返回对应元素数组下标
- 当元素不存在 : 返回对应元素数组插入点下标
2、有序数列中存在重复元素,寻找最左元素和最有元素
思路:当找到元素后,继续寻找,直到循环结束
- 【当右指针 j 找到 , 执行 j = m - 1 , 可以找到最左target】
- 【当左指针 i 找到 , 执行 i = m + 1 , 可以找到最右target】
java
class Solution {
public int[] searchRange(int[] nums, int target) {
if(Arrays.binarySearch(nums,target) < 0) return new int[]{-1,-1};
int i = Min(nums,target);
int j = Max(nums,target);
return new int[]{i , j};
}
public static int Max(int[] nums, int target) {
int i = 0, j = nums.length - 1;
while (i <= j) {
int m = (i + j) >>> 1;
if (nums[m] <= target) {
i = m + 1;
} else {
j = m - 1;
}
}
return j;
}
public static int Min(int[] nums, int target) {
int i = 0, j = nums.length - 1;
while (i <= j) {
int m = (i + j) >>> 1;
if (nums[m] < target) {
i = m + 1;
} else {
j = m - 1;
}
}
return i;
}
}
day2