LeetCode 436. Find Right Interval

436. Find Right Interval

Description Submission Solutions Add to List

  • Total Accepted: 7209
  • Total Submissions: 17507
  • Difficulty: Medium
  • Contributors: love_FDU_llp

 

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:

  1. You may assume the interval's end point is always bigger than its start point.
  2. 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.

Subscribe to see which companies asked this question.

【题目分析】

这个题目的意思是:给定一系列的区间,对于任意一个区间,在所有区间中找到一个区间的起始点大于等于当前区间的结束点,并且要求这两个点最接近。

【思路】

首先对所有区间的起始点进行排序,然后对于每一个区间使用二分查找来找到与这个区间结束点最接近的起始点的区间,并且获得该区间的索引。

【实现】

在讨论区看到java的解法好多是用TreeMap来实现的,这样的实现代码简洁,但是要求大家对java比较熟练。

 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         int[] result = new int[intervals.length];
13         
14         TreeMap<Integer, Integer> treemap = new TreeMap<>();
15         
16         for(int i = 0; i < intervals.length; i++) {
17             treemap.put(intervals[i].start, i);
18         }
19         
20         for(int i = 0; i < intervals.length; i++) {
21             Map.Entry<Integer, Integer> item = treemap.ceilingEntry(intervals[i].end);
22             result[i] = (item == null) ? -1 : item.getValue();
23         }
24         
25         return result;
26     }
27 }

 

posted @ 2017-02-14 20:15  Black_Knight  阅读(850)  评论(0编辑  收藏  举报