zoukankan      html  css  js  c++  java
  • [LeetCode] 436. 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:

    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.

    NOTE: input types have been changed on April 15, 2019. Please reset to default code definition to get new method signature.

    寻找右区间。

    题意是给一个list,里面装的是一些interval区间,对于每个interval i,请你寻找是否存在另外一个interval j,满足j在i的右边。在右边的定义是j的起点要大于等于i的终点。对于每一个interval i,如果能找到一个这样的j区间,则返回j的下标,否则返回-1。

    这个题二分法可以做,但是代码不是很好写,面试的时候如果不熟练很容易写不完。我这里介绍一个treemap的做法。遍历input,将每个区间的起点当做key,每个区间的下标当做value放入treemap。再次遍历input,此时会利用到treemap的一个函数叫做ceilingKey(),找当前map中是否存在一个最小的区间的起点,这个起点比当前遍历到的区间的终点要大。如果找到,则放入结果集。

    时间O(nlogn)

    空间O(n)

    Java实现

     1 class Solution {
     2     public int[] findRightInterval(int[][] intervals) {
     3         int[] res = new int[intervals.length];
     4         TreeMap<Integer, Integer> map = new TreeMap<>();
     5         for (int i = 0; i < intervals.length; i++) {
     6             map.put(intervals[i][0], i);
     7         }
     8 
     9         for (int i = 0; i < intervals.length; i++) {
    10             Integer key = map.ceilingKey(intervals[i][1]);
    11             res[i] = key != null ? map.get(key) : -1;
    12         }
    13         return res;
    14     }
    15 }

    LeetCode 题目总结

  • 相关阅读:
    how to uninstall devkit
    asp.net中bin目录下的 dll.refresh文件
    查找2个分支的共同父节点
    Three ways to do WCF instance management
    WCF Concurrency (Single, Multiple, and Reentrant) and Throttling
    检查string是否为double
    How to hide TabPage from TabControl
    获取当前系统中的时区
    git svn cygwin_exception
    lodoop打印控制具体解释
  • 原文地址:https://www.cnblogs.com/cnoodle/p/13575155.html
Copyright © 2011-2022 走看看