34. 在排序数组中查找元素的第一个和最后一个位置
题目描述
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
你的算法时间复杂度必须是 O(log n) 级别。
如果数组中不存在目标值,返回 [-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]
贴出代码
class Solution {
public int[] searchRange(int[] nums, int target) {
int n = nums.length;
int[] nr = {-1,-1};
if (n == 0){
return nr;
}
int l = 0, r = n - 1;
while (l < r){
int mid = (l + r) >> 1;
if (nums[mid] >= target)
r = mid;
else l = mid + 1;
}
int lres = l;
if (nums[l] != target){
return nr;
}
l = 0;
r = n - 1;
while (l < r){
int mid = (l + r + 1) >> 1;
if (nums[mid] > target)
r = mid - 1;
else l = mid;
}
int rres = r;
return new int[]{lres, rres};
}
}
func searchRange(nums []int, target int) []int {
n := len(nums)
nr := []int{-1,-1}
if n == 0 {
return nr
}
l, r := 0, n - 1
for l < r{
mid := (l + r) >> 1
if nums[mid] >= target {
r = mid
} else{
l = mid + 1
}
}
lres := l
if nums[l] != target {
return nr
}
l = 0
r = n - 1
for l < r{
mid := (l + r + 1) >> 1
if nums[mid] > target {
r = mid - 1
}else{
l = mid
}
}
rres := r
return []int{lres,rres}
}