34_在排序数组中查找元素的第一个和最后一个位置[MEDIUM]
约 469 字大约 2 分钟
2026-02-26
题目:find-first-and-last-position-of-element-in-sorted-array
给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。
示例 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]解题思路
- 查找第一个位置,可以变相为二分查找
target - 0.5,返回 left 的坐标 - 查找最后一个位置,可以变相为二分查找
target + 0.5,返回 right 的坐标

注意两个问题:
- 越界问题, 找第一个位置时,
first >= nums.length说明越界(即 [2,2] 里面找 3 的情况,此时返回的 first 是 2,明显是越界了 ) - 判断不命中的情况,
nums[left] != target
Java 实现
class Solution {
public int[] searchRange(int[] nums, int target) {
if (nums.length < 1){
return new int[]{-1, -1};
}
int left = 0;
int right = nums.length - 1;
double targetLeft = (double) target - 0.5;
double targetRight = (double) target + 0.5;
// 查找第一个位置
int first = binarySearch(nums, targetLeft, true);
// 越界判断 || 不命中判断
if (first >= nums.length || nums[first] != target){
return new int[]{-1,-1};
}
// 查找第二个位置
int last = binarySearch(nums, targetRight, false);
return new int[]{first,last};
}
// 二分查找
// 查找第一个位置,返回left ,查找第二个位置,返回right
private int binarySearch(int[] nums, double target, boolean findLeft){
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 {
left = mid + 1;
}
}
if (findLeft){
return left;
}
return right;
}
}