题目描述
给定一个按照升序排列的整数数组 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]
思路
1.从本题的时间复杂度来看,肯定是要使用二分搜索算法。
2.我们可以使用两次二分搜索算法,第一次查询左边的索引,第二次查询右边的索引。
3.注意处理边界值,不越界就好啦。
Java代码实现
public int[] searchRange(int[] nums, int target) {
int leftIndex = -1;
int rightIndex = -1;
int left = 0;
int right = nums.length-1;
//先找左边
while(left <= right){
int mid = (left+right)/2;
if(nums[mid]<target){
left = mid + 1;
}else if(nums[mid]>target){
right = mid - 1;
}else{
if(mid == 0 || nums[mid-1] != nums[mid]){
leftIndex = mid;
break;
}else {
right = mid - 1;
}
}
}
left = 0;
right = nums.length-1;
//再找右边
while(left <= right){
int mid = (left+right)/2;
if(nums[mid]<target){
left = mid + 1;
}else if(nums[mid]>target){
right = mid - 1;
}else{
if(mid == nums.length-1 || nums[mid+1] != nums[mid]){
rightIndex = mid;
break;
}else {
left = mid + 1;
}
}
}
return new int[]{leftIndex,rightIndex};
}Golang代码实现
func searchRange(nums []int, target int) []int {
left,right := 0,len(nums)-1
leftIndex,rightIndex := -1,-1
//先找左边
for left <= right {
mid := (left+right)/2
if nums[mid] == target{
if mid == 0 || nums[mid-1] != nums[mid] {
leftIndex = mid
break
}else{
right = mid-1
}
} else if nums[mid] > target{
right = mid-1
} else{
left = mid+1
}
}
left,right = 0,len(nums)-1
//再找右边
for left <= right {
mid := (left+right)/2
if nums[mid] == target{
if mid == len(nums)-1 || nums[mid+1] != nums[mid] {
rightIndex = mid
break
}else{
left = mid+1
}
} else if nums[mid] > target{
right = mid-1
} else{
left = mid+1
}
}
return []int{leftIndex,rightIndex}
}
京公网安备 11010502036488号