leetcode34. 在排序数组中查找元素的第一个和最后一个位置
题目描述
链接: leetcode34.
给定一个按照升序排列的整数数组 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]
题解
二分查找
- java解法
public class SearchRange34 {
public int[] searchRange(int[] nums, int target) {
int[] res = new int[]{-1, -1};
res[0] = binarySearch(nums, target, true);
res[1] = binarySearch(nums, target, false);
return res;
}
private int binarySearch(int[] nums, int target, boolean isLeft) {
int left = 0;
int right = nums.length - 1;
int index = -1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] == target) {
index = mid;
if (isLeft) {
right = mid - 1;
} else {
left = mid + 1;
}
} else if (nums[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return index;
}
}
- golang解法
func searchRange(nums []int, target int) []int {
res := []int{-1, -1}
res[0] = binarySearch(nums, target, true)
res[1] = binarySearch(nums, target, false)
return res
}
func binarySearch(nums []int, target int, isLeft bool) int {
left, right, res := 0, len(nums) - 1, -1
for left <= right {
mid := left + (right - left) / 2
if nums[mid] == target {
res = mid
if isLeft {
right = mid - 1
} else {
left = mid + 1
}
} else if nums[mid] < target {
left = mid + 1
} else {
right = mid - 1
}
}
return res
}