mirror of
https://gitee.com/TheAlgorithms/LeetCodeAnimation.git
synced 2024-12-31 15:25:33 +08:00
82 lines
2.1 KiB
Java
82 lines
2.1 KiB
Java
|
# LeetCode 第 34 号问题:在排序数组中查找元素的第一个和最后一个位置
|
|||
|
|
|||
|
|
|||
|
题目来源于 LeetCode 上第 34 号问题:find-first-and-last-position-of-element-in-sorted-array。题目难度为 中等。
|
|||
|
|
|||
|
### 题目描述
|
|||
|
|
|||
|
给定一个按照升序排列的整数数组 **nums**,和一个目标值 **target**。找出给定目标值在数组中的开始位置和结束位置。
|
|||
|
|
|||
|
你的算法时间复杂度必须是 **O(log n)** 级别。
|
|||
|
|
|||
|
如果数组中不存在目标值,返回 [-1, -1]。
|
|||
|
|
|||
|
|
|||
|
**示例:**
|
|||
|
|
|||
|
```
|
|||
|
输入: nums = [5,7,7,8,8,10], target = 8
|
|||
|
输出: [3,4]
|
|||
|
```
|
|||
|
```
|
|||
|
输入: nums = [5,7,7,8,8,10], target = 6
|
|||
|
输出: [-1,-1]
|
|||
|
```
|
|||
|
### 题目解析
|
|||
|
|
|||
|
题目中要求了时间复杂度为O(log n),这就很清楚要使用二分查找法了。
|
|||
|
|
|||
|
首先定义两个指针变量,分别存储左右两个位置的索引。首先去找目标值的最左面的索引,通过循环为了防止元素丢失,每次保留最右面的元素,左侧的指针移动时+1。在循环结束的时候判断一下数组中是否包括目标值,不包括的话直接退出。
|
|||
|
右面的跟左侧相同,只不过正好相反。
|
|||
|
|
|||
|
|
|||
|
|
|||
|
### 动画描述
|
|||
|
|
|||
|
![](..\Animation\在排序数组中查找元素的第一个和最后一个位置.gif)
|
|||
|
|
|||
|
### 代码实现
|
|||
|
|
|||
|
```java
|
|||
|
// 34. 下一个排列
|
|||
|
// https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/
|
|||
|
// 时间复杂度:O(n)
|
|||
|
// 空间复杂度:O(1)
|
|||
|
class Solution {
|
|||
|
public int[] searchRange(int[] nums, int target) {
|
|||
|
int[] res = new int[] { -1, -1 };
|
|||
|
int left = 0;
|
|||
|
int right = nums.length - 1;
|
|||
|
int l = left;
|
|||
|
int r = right;
|
|||
|
while (left < right) {
|
|||
|
int mid = (left + right) / 2;
|
|||
|
if (nums[mid] < target) {
|
|||
|
left = mid + 1;
|
|||
|
} else {
|
|||
|
right = mid;
|
|||
|
}
|
|||
|
}
|
|||
|
if (left>right||nums[left]!=target) {
|
|||
|
return new int[]{-1,-1};
|
|||
|
}
|
|||
|
while (l < r) {
|
|||
|
int mid = (l + r) / 2 + 1;
|
|||
|
if (nums[mid] > target) {
|
|||
|
r = mid - 1;
|
|||
|
} else {
|
|||
|
l = mid;
|
|||
|
}
|
|||
|
}
|
|||
|
if (left > right || left > r) {
|
|||
|
return new int[] { -1, -1 };
|
|||
|
} else {
|
|||
|
return new int[] { left, r };
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
```
|
|||
|
|
|||
|
![](../../Pictures/qrcode.jpg)
|