问题:
给定一组区间,对于每一个区间 i,检查是否存在一个区间 j,它的起始点大于或等于区间 i 的终点,这可以称为 j 在 i 的“右侧”。
对于任何区间,你需要存储的满足条件的区间 j 的最小索引,这意味着区间 j 有最小的起始点可以使其成为“右侧”区间。如果区间 j 不存在,则将区间 i 存储为 -1。最后,你需要输出一个值为存储的区间值的数组。
注意:
你可以假设区间的终点总是大于它的起始点。
你可以假定这些区间都不具有相同的起始点。
思路:
第一种方法暴力法,时间复杂度为O(n^2),空间复杂度为O(n)
第二种方法排序+扫描,首先基于左端点排序,然后再扫描确定。时间复杂度为O(n^2),空间复杂度为O(n)
第三种方法排序+二分法。时间复杂度为O(nlgn),空间复杂度为O(n)
第四种方法使用treemap,信赖于TreeMap.ceilingEntry方法,时间复杂度为O(nlgn),空间复杂度为O(n)
第五种方法使用两个数组,一个基于左端点排序,另外一个基于右端点排序。在对排序后的基于右端点排序后的数组遍历时,以另外一个数组中找到满足条件后,基于前一次的位置开始查找。时间复杂度为O(nlgn),空间复杂度为O(n)
具体代码参考:
https://github.com/wuli2496/OJ/tree/master/LeetCode/Find%20Right%20Interval