LeetCode 34题 -> 在排序数组中查找元素第一个位置和最后一个位置
1. 题目描述
-
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。
-
示例 :
输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]
2. 解题思路
-
二分法查找
- 找第一个等于target的数的位置,即左边界;
- 找第一个大于target的数的位置-1,即右边界;
如图为找左边界的思路,找右边界同理!
3. 代码实现
import java.util.Arrays;
public class SearchRange {
public static int[] searchRange(int[] nums, int target){
int firstPosition = findFirstPosition(nums,target);
int lastPosition = findLastPosition(nums,target);
return new int[]{firstPosition,lastPosition};
}
//找左边界
public static int findFirstPosition(int[] nums, int target){
if(nums == null || nums.length < 0){
return -1;
}
int left = 0;
int right = nums.length-1;
while(left <= right){
int mid = left + (right - left) / 2;
if(nums[mid] == target){
right = mid - 1;
}else if(nums[mid] < target){
left = mid + 1;
}else{
right = mid - 1;
}
}
if(left >= nums.length || nums[left] != target){
return -1;
}
return left;
}
//找右边界
public static int findLastPosition(int[] nums, int target){
if(nums == null || nums.length < 0){
return -1;
}
int left = 0;
int right = nums.length - 1;
while(left <= right){
int mid = left + (right - left) / 2;
if(nums[mid] == target){
left = mid + 1;
}else if(nums[mid] > target){
right = mid - 1;
}else{
left = mid + 1;
}
}
if(right <= -1 || nums[right] != target){
return -1;
}
return right;
}
//测试
public static void main(String[] args) {
int[] nums = {5, 7, 7, 8, 8, 10};
int target = 8;
System.out.println(Arrays.toString(searchRange(nums, target)));
}
}