436. 寻找右区间

给定一组区间,对于每一个区间 i,检查是否存在一个区间 j,它的起始点大于或等于区间 i 的终点,这可以称为 j 在 i 的“右侧”。

对于任何区间,你需要存储的满足条件的区间 j 的最小索引,这意味着区间 j 有最小的起始点可以使其成为“右侧”区间。如果区间 j 不存在,则将区间 i 存储为 -1。最后,你需要输出一个值为存储的区间值的数组。

注意:

你可以假设区间的终点总是大于它的起始点。

你可以假定这些区间都不具有相同的起始点。

示例 1:

输入: [ [1,2] ]

输出: [-1]

解释:集合中只有一个区间,所以输出-1。

示例 2:

输入: [ [3,4], [2,3], [1,2] ]

输出: [-1, 0, 1]

解释:对于[3,4],没有满足条件的“右侧”区间。

对于[2,3],区间[3,4]具有最小的“右”起点;

对于[1,2],区间[2,3]具有最小的“右”起点。

示例 3:

输入: [ [1,4], [2,3], [3,4] ]

输出: [-1, 2, -1]

解释:对于区间[1,4]和[3,4],没有满足条件的“右侧”区间。

对于[2,3],区间[3,4]有最小的“右”起点。

class Solution {
public int[] findRightInterval(int[][] intervals) {
int length = intervals.length;
int[] res = new int[length];
MyNode[] list = new MyNode[length];
for (int i = 0; i < length; i++) {
list[i] = new MyNode(intervals[i][0], intervals[i][1], i);
}
Arrays.sort(list, new Comparator<MyNode>() {
public int compare(MyNode a, MyNode b) {
return a.start - b.start;
}
});
for (int i = 0; i < length; i++) {
res[list[i].index] = greater(list, 0, length - 1, list[i].end);
}
return res;
} class MyNode {
int start; // 区间的起点
int end; // 区间的终点
int index; // 在原数组的下标 public MyNode(int start, int end, int index) {
this.start = start;
this.end = end;
this.index = index;
}
} // 二分查找第一个区间的起点大于等于target的数组元素的下标,数组是升序排序,范围是[left,right]
private int greater(MyNode[] list, int left, int right, int target) {
while (left <= right) {
int mid = (left + right) >>> 1;
if (list[mid].start < target) {
left = mid + 1;
} else {
if (mid - 1 >= left && list[mid - 1].start >= target) {
right = mid - 1;
} else {
return list[mid].index;
}
}
}
return -1; // list[right].start<target
}
}

Java实现 LeetCode 436 寻找右区间的更多相关文章

  1. Leetcode 436.寻找右区间

    寻找右区间 给定一组区间,对于每一个区间 i,检查是否存在一个区间 j,它的起始点大于或等于区间 i 的终点,这可以称为 j 在 i 的"右侧". 对于任何区间,你需要存储的满足条 ...

  2. 436. 寻找右区间--LeetCode_二分

    来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/find-right-interval 著作权归领扣网络所有.商业转载请联系官方授权,非商业转载请注明出 ...

  3. 436. 寻找右区间--LeetCode_暴力

    来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/find-right-interval 著作权归领扣网络所有.商业转载请联系官方授权,非商业转载请注明出 ...

  4. 【LeetCode】寻找右区间

    [问题] 给定一组区间,对于每一个区间 i,检查是否存在一个区间 j,它的起始点大于或等于区间 i 的终点,这可以称为 j 在 i 的“右侧”. 对于任何区间,你需要存储的满足条件的区间 j 的最小索 ...

  5. 436 Find Right Interval 寻找右区间

    给定一组区间,对于每一个区间 i,检查是否存在一个区间 j,它的起始点大于或等于区间 i 的终点,这可以称为 j 在 i 的“右侧”.对于任何区间,你需要存储的满足条件的区间 j 的最小索引,这意味着 ...

  6. [Swift]LeetCode436. 寻找右区间 | Find Right Interval

    Given a set of intervals, for each of the interval i, check if there exists an interval j whose star ...

  7. Java实现 LeetCode 744 寻找比目标字母大的最小字母(二分法)

    744. 寻找比目标字母大的最小字母 给定一个只包含小写字母的有序数组letters 和一个目标字母 target,寻找有序数组里面比目标字母大的最小字母. 在比较时,数组里字母的是循环有序的.举个例 ...

  8. Java实现 LeetCode 4 寻找两个有序数组的中位数

    寻找两个有序数组的中位数 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 n ...

  9. Java实现 LeetCode 763 划分字母区间(暴力)

    763. 划分字母区间 字符串 S 由小写字母组成.我们要把这个字符串划分为尽可能多的片段,同一个字母只会出现在其中的一个片段.返回一个表示每个字符串片段的长度的列表. 示例 1: 输入: S = & ...

随机推荐

  1. 一看就懂的Ubuntu系统下samba服务器安装配置教程

    文章目录 前言 环境搭建 安装 配置 Examples 1 创建共享(任何人都可以访问) 2 单用户权限(需要密码访问) 添加samba用户 配置参数 3 支持游客访问(单用户拥有管理员权限) 前言 ...

  2. 仿真FFT(quartus安装)

    软件下载:http://dl.altera.com/13.1/?edition=subscription 安装步骤: 接下来,仿真FFT: http://www.openhw.org/article/ ...

  3. 2020年腾讯实习生C++面试题&持续更新中(1)

    2020年腾讯实习生C++面试题&持续更新中(1) 腾讯面试整理(1) 最近大三的学生找实习生的同学非常多,给大家分享一篇腾讯实习生的面试题,关于面试题,会持续更新~~~ 也算是今天开通博客的 ...

  4. Mockito不能mock final类的解决办法

    Mockito是很常用的测试工具,使用过程中可能会遇到下面的问题: Mockito cannot mock/spy because : - final class 问题重现: 引入该依赖到项目的mav ...

  5. Java并发编程:线程和锁的使用与解析

    线程的使用  新建线程 新建一个线程有两种方法:继承Thread类,然后重写run方法:实现Runnable接口,然后实现run方法.实际上Thread类也是实现的Runnable接口,再加上类只能单 ...

  6. 最简单的git 用法

    步骤 在机器上ssh-keygen 然后把id_rsa.pub 复制到csdn 的公钥上去. git clone git@code.csdn.net:aca_jingru/zabbix.git 如果这 ...

  7. nginx default server

    配合server_name _ 可以匹配所有的域名,在设置default server 可以轻松屏蔽一些非域名访问的请求. 配置如下 server { listen 80 default_server ...

  8. 浅谈JQuery

    一.什么是JQuery? JQuery是第三方开发的执行DOM操作的极简化的函数库. 执行DOM操作:JQuery还是在执行DOM操作 1.学习JQuery还是在学习DOM 2.五件事:增删改查 事件 ...

  9. 安装OPENCTI

    应业务需求,需要安装OPENCTI.很无奈的配了一下午. 首先是安装需求: 1. Ubuntu 2. Docker version 19.03.5 + docker-compose version 1 ...

  10. CF834D

    题目链接:http://codeforces.com/contest/834/problem/D 题目大意:将一个有n个数的数列分成k段,每段的价值为该段中不同数字的个数,求k段的最大总价值. 解题思 ...