目录
1. 问题描述
给你一个区间数组 intervals
,其中 intervals[i] = [starti, endi]
,且每个 starti
都 不同 。
区间 i
的 右侧区间 可以记作区间 j
,并满足 startj
>= endi
,且 startj
最小化 。
返回一个由每个区间 i
的 右侧区间 的最小起始位置组成的数组。如果某个区间 i
不存在对应的 右侧区间 ,则下标 i
处的值设为 -1
。
示例 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]具有最小的“右”起点。
示例 3:
输入:intervals = [[1,4],[2,3],[3,4]] 输出:[-1,2,-1] 解释:对于区间 [1,4] 和 [3,4] ,没有满足条件的“右侧”区间。 对于 [2,3] ,区间 [3,4] 有最小的“右”起点。
提示:
1 <= intervals.length <= 2 * 10^4
intervals[i].length == 2
-10^6 <= starti <= endi <= 10^6
- 每个间隔的起点都 不相同
2. 思路与算法
这题可能是翻译有问题,第一感是求:针对每个区间而言,就是找所有其它中比小的最小值,如果没有比小的则返回-1。但是看了示例后,觉得不对,应该是求每个区间 的 右侧区间 的在原数组中的索引的最小值,即所有右侧区间中最靠左的那个的索引值。
进一步,由于“<=
”,所以这个右侧区间也包含它自己。
对原数组以为基准先进行排序。排完序后,按从小到大(从左到右)扫描,由于各不相同,所以,排在前面的区间肯定不能是排在后面的区间的右侧区间。因此,针对排序后的各区间,只需要由它自身向后扫描搜索第一个不小于自己的的开始的区间。如果等于则它自己就是自己的右侧区间。
以上找到右侧区间后,还需要映射回原数组中的序号。
3. 代码实现
class Solution:
def findRightInterval(self, intervals: List[List[int]]) -> List[int]:
start = dict()
for k,intvl in enumerate(intervals):
start[intvl[0]] = k
intervals.sort(key = lambda x: x[0])
ans = len(intervals)*[0]
for k,intvl in enumerate(intervals):
isFound = False
for j in range(k,len(intervals)):
if intervals[j][0] >= intervals[k][1]:
ans[start[intervals[k][0]]] = start[intervals[j][0]]
isFound = True
break
if not isFound:
ans[start[intervals[k][0]]] = -1
return ans
执行用时:6172 ms, 在所有 Python3 提交中击败了6.21%的用户
内存消耗:18.9 MB, 在所有 Python3 提交中击败了53.84%的用户
回到总目录:Leetcode每日一题总目录(动态更新。。。)