📍 在排序数组中查找元素的第一个和最后一个位置
📝 题目描述
给你一个按照非递减(递增)顺序排列的整数数组nums
,和一个目标值target
,请你找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值target
,返回[-1, -1]
。
你必须设计并实现时间复杂度为0(log n)
的算法解决此问题。
📋 代码模版
java
class Solution {
public int[] searchRange(int[] nums, int target) {
}
}
typescript
function searchRange(nums: number[], target: number): number[] {
}
💡 提示
🚀 示例
🖊️ 题解
鉴于数组是升序排列且算法时间复杂度需为
通过二分查找,我们可以方便地找到数组中第一个大于或等于
需要注意的是,尽管数组
java
public class Solution {
public int[] searchRange(int[] nums, int target) {
int start = binarySearch(nums, target);
if (start == nums.length || nums[start] != target) {
return new int[]{-1, -1};
}
int end = binarySearch(nums, target + 1) - 1;
return new int[]{start, end};
}
private int binarySearch(int[] nums, int target) {
int low = 0, high = nums.length - 1;
while (low <= high) {
int mid = low + ((high - low) >> 1);
if (nums[mid] >= target) {
high = mid - 1;
} else {
low = mid + 1;
}
}
return low;
}
}
typescript
function searchRange(nums: number[], target: number): number[] {
const binarySearch = (target: number): number => {
let low = 0, high = nums.length - 1;
while (low <= high) {
const mid = low + Math.floor((high - low) / 2);
if (nums[mid] >= target) {
high = mid - 1;
} else {
low = mid + 1;
}
}
return low;
}
const start = binarySearch(target);
if (start == nums.length || nums[start] != target) {
return [-1, -1];
}
const end = binarySearch(target + 1) - 1;
return [start, end];
}
💭 复杂度分析
基于二分查找
的解决方案的复杂度分析如下。
- 时间复杂度:
。 - 空间复杂度:
。