侧边栏壁纸
博主头像
GabrielxD

列車は必ず次の駅へ。では舞台は?私たちは?

  • 累计撰写 675 篇文章
  • 累计创建 128 个标签
  • 累计收到 29 条评论

目 录CONTENT

文章目录

【排序, 二分查找】寻找右区间

GabrielxD
2022-05-20 / 0 评论 / 0 点赞 / 215 阅读 / 669 字
温馨提示:
本文最后更新于 2022-07-26,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

题目

436. 寻找右区间


给你一个区间数组 intervals ,其中 intervals[i] = [start_i, end_i] ,且每个 starti 都 不同 。

区间 i 的 右侧区间 可以记作区间 j ,并满足 start_j >= end_i ,且 start_j 最小化 。

返回一个由每个区间 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
  • 每个间隔的起点都 不相同

解题

方法一:排序 二分查找

思路

创建一个辅助区间数组 sortedIntervals 对于每个 sortedIntervals[i] 其索引为0的元素是 intervals[i] 区间的起点,其索引为1的元素是该区间在原区间数组中的索引 i。把 sortedIntervals 按照区间的起点升序排序方便后面使用二分查找找到需要的区间。

维护一个结果数组 ans

遍历 intervals 数组,对于其中每个区间:

  • 记当前区间的终点为 target ($end_i$)。
  • 使用二分查找找到 sortedIntervals 中大于 target 的区间起点(sortedIntervals[mid][0])($start_j$)。
  • 此时当前区间的右区间索引就是 sortedIntervals[left][1]
  • 如果索引 left 越界则说明当前区间没有有区间,则为 -1
  • 把结果数组中 ans[i] 置为右区间的索引。

代码

class Solution {
    public int[] findRightInterval(int[][] intervals) {
        int len = intervals.length;
        int[][] sortedIntervals = new int[len][2];
        int[] ans = new int[len];
        for (int i = 0; i < len; i++) {
            sortedIntervals[i][0] = intervals[i][0];
            sortedIntervals[i][1] = i;
        }
        Arrays.sort(sortedIntervals, (a, b) -> a[0] - b[0]);
        for (int i = 0; i < len; i++) {
            int target = intervals[i][1];
            int left = 0, right = len - 1;
            while (left <= right) {
                int mid = left + ((right - left) >> 1);
                if (sortedIntervals[mid][0] < target) left = mid + 1;
                else right = mid - 1; 
            }
            ans[i] = left == len ? -1 : sortedIntervals[left][1];
        }
        return ans;
    }
}
0

评论区