0436. 寻找右区间
大约 2 分钟
---
0436. 寻找右区间
- 标签:数组、二分查找、排序
- 难度:中等
题目链接
题目大意
描述:
给定一个区间数组 ,其中 ,且每个 都不同。
区间 的「右侧区间」是满足 ,且 「最小」的区间 。注意 可能等于 。
要求:
返回一个由每个区间 对应的「右侧区间」下标组成的数组。如果某个区间 不存在对应的「右侧区间」,则下标 处的值设为 。
说明:
- 。
- 。
- 。
- 每个间隔的起点都不相同。
示例:
- 示例 1:
输入:intervals = [[1,2]]
输出:[-1]
解释:集合中只有一个区间,所以输出-1。- 示例 2:
输入:intervals = [[3,4],[2,3],[1,2]]
输出:[-1,0,1]
解释:对于 [3,4] ,没有满足条件的“右侧”区间。
对于 [2,3] ,区间[3,4]具有最小的“右”起点;
对于 [1,2] ,区间[2,3]具有最小的“右”起点。解题思路
思路 1:排序 + 二分查找
- 为每个区间保存原索引,按照区间起点 进行排序。
- 对于每个区间 ,用二分查找在排序后的数组中找第一个 的区间。
- 若找到则返回对应原索引,否则为 。
思路 1:代码
class Solution:
def findRightInterval(self, intervals: List[List[int]]) -> List[int]:
n = len(intervals)
# 保存每个区间的原索引和起点
start_pos = [(intervals[i][0], i) for i in range(n)]
# 按照起点排序
start_pos.sort()
ans = []
# 对于每个区间,使用二分查找找右区间
for start, end in intervals:
# 二分查找第一个 start_j >= end 的区间
left, right = 0, n - 1
res_index = -1
while left <= right:
mid = (left + right) // 2
if start_pos[mid][0] >= end:
res_index = start_pos[mid][1]
right = mid - 1 # 继续往左找更小的
else:
left = mid + 1
ans.append(res_index)
return ans思路 1:复杂度分析
- 时间复杂度:,其中 是区间数量。排序 ,二分查找 次共 。
- 空间复杂度:,排序需要额外空间。