Leetcode: Find Right Interval

Posted neverlandly

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode: Find Right Interval相关的知识,希望对你有一定的参考价值。

Given a set of intervals, for each of the interval i, check if there exists an interval j whose start point is bigger than or equal to the end point of the interval i, which can be called that j is on the "right" of i.

For any interval i, you need to store the minimum interval j‘s index, which means that the interval j has the minimum start point to build the "right" relationship for interval i. If the interval j doesn‘t exist, store -1 for the interval i. Finally, you need output the stored value of each interval as an array.

Note:
You may assume the interval‘s end point is always bigger than its start point.
You may assume none of these intervals have the same start point.
Example 1:
Input: [ [1,2] ]

Output: [-1]

Explanation: There is only one interval in the collection, so it outputs -1.
Example 2:
Input: [ [3,4], [2,3], [1,2] ]

Output: [-1, 0, 1]

Explanation: There is no satisfied "right" interval for [3,4].
For [2,3], the interval [3,4] has minimum-"right" start point;
For [1,2], the interval [2,3] has minimum-"right" start point.
Example 3:
Input: [ [1,4], [2,3], [3,4] ]

Output: [-1, 2, -1]

Explanation: There is no satisfied "right" interval for [1,4] and [3,4].
For [2,3], the interval [3,4] has minimum-"right" start point.

Solution 1: TreeMap,      Time complexity: O(NlogN)

像这种在一个集合里面寻找有没有比某个数小的数,一般要么treeMap要么treeSet。Interval的题经常需要用treeMap, Data Stream as Disjoint Intervals 就是

map.higherEntry(key) 找到的是一个entry with least key strictly greater than the given key, 所以20行要减一,因为interval.start可能跟current interval.end重合

用map.cellingEntry(key)找的就是一个entry with least key greater than or equal to the given key

 1 /**
 2  * Definition for an interval.
 3  * public class Interval {
 4  *     int start;
 5  *     int end;
 6  *     Interval() { start = 0; end = 0; }
 7  *     Interval(int s, int e) { start = s; end = e; }
 8  * }
 9  */
10 public class Solution {
11     public int[] findRightInterval(Interval[] intervals) {
12         if(intervals==null || intervals.length==0) return null;
13         int[] res = new int[intervals.length];
14         TreeMap<Integer, Integer> map = new TreeMap<Integer, Integer>();
15         for (int i=0; i<intervals.length; i++) {
16             map.put(intervals[i].start, i);
17         }
18         for (int i=0; i<intervals.length; i++) {
19             Interval cur = intervals[i];
20             Map.Entry<Integer, Integer> entry = map.higherEntry(cur.end-1);
21             if (entry != null) {
22                 res[i] = entry.getValue();
23             }
24             else res[i] = -1;
25         }
26         return res;
27     }
28 }

 

Solution 2: Sweep Line Solution(未深究), Time Complexity: O(NlogN)

https://discuss.leetcode.com/topic/65585/java-sweep-line-solution-o-nlogn

以上是关于Leetcode: Find Right Interval的主要内容,如果未能解决你的问题,请参考以下文章

[LeetCode]436 Find Right Interval

[Leetcode] Binary search--436. Find Right Interval

LeetCode 436. Find Right Interval

leetcode 1893

LeetCode 652. Find Duplicate Subtrees

LeetCode 501. Find Mode in Binary Search Tree(寻找二叉查找树中出现次数最多的值)