34.在排序数组中查找元素的第一个和最后一个位置

题目描述

原题
给定一个按照升序排列的整数数组nums,和一个目标值target。找出给定目标值在数组中的开始位置和结束位置。
你的算法时间复杂度必须是 O(log n) 级别。
如果数组中不存在目标值,返回 [-1, -1]
示例 1:
1
输入: nums = [5,7,7,8,8,10], target = 8
2
输出: [3,4]
Copied!
示例 2:
1
输入: nums = [5,7,7,8,8,10], target = 6
2
输出: [-1,-1]
Copied!

题解

用二分查找找到目标数的左边界和有边界
1
public int[] searchRange(int[] nums, int target) {
2
return new int[]{left_bound(nums,target),right_bound(nums,target)};
3
}
4
public int left_bound(int[] nums, int target) {
5
int low = 0, high = nums.length - 1;
6
while (low <= high) {
7
int middle = low + (high - low) / 2;
8
if (nums[middle] > target) {
9
high = middle - 1;
10
} else if (nums[middle] < target) {
11
low = middle + 1;
12
} else {
13
high = middle - 1;
14
}
15
}
16
//检查出界情况
17
if (low > nums.length -1 || nums[low] != target) {
18
return -1;
19
}
20
return low;
21
}
22
public int right_bound(int[] nums, int target) {
23
int low = 0, high = nums.length - 1;
24
while (low <= high) {
25
int middle = low + (high - low) / 2;
26
if (nums[middle] > target) {
27
high = middle - 1;
28
} else if (nums[middle] < target) {
29
low = middle + 1;
30
} else {
31
low = middle + 1;
32
}
33
}
34
if(high < 0 || nums[low]!=target){
35
return -1;
36
}
37
return high;
38
}
Copied!
最近更新 10mo ago
复制链接