LeetCode 每日一题——436. 寻找右区间

news/2024/11/22 21:06:25/

1.题目描述

436. 寻找右区间
给你一个区间数组 intervals ,其中 intervals[i] = [starti, endi] ,且每个 starti 都 不同 。

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

返回一个由每个区间 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] 有最小的“右”起点。

2.思路

2.1 代码

需要在给定的数组 intervals 中找到右区间,其实就是在 intervals 中找到第一位大于等于当前行第二位的行号,那么题目就可以简化为在二维数组 intervals 的第一列中找到某一个数。

这么一看这道题目就简单了,首先需要维护第一列的数和对应行的关系,这里用一个 Info 类进行维护,index 表示所在行,value 表示数值。然后使用数组存放每一列构造出来的 Info 对象,再根据 Info 的 value 将数组从小到大进行排序。

完成排序后,使用二分查找法在该数组中依次对每一行的第二位进行查找,最后将查找到的 Info 对象的 index 存入结果数组中。代码如下:

class Solution {public int[] findRightInterval(int[][] intervals) {int[] ans = new int[intervals.length];if (intervals.length == 1) {ans[0] = -1;return ans;}Info[] list = new Info[intervals.length];for (int i = 0; i < intervals.length; i++) {Info info = new Info(i, intervals[i][0]);list[i] = info;}Arrays.sort(list, Comparator.comparingInt(o -> o.value));for (int i = 0; i < intervals.length; i++) {ans[i] = getRightArea(list, intervals[i][1]);}return ans;}public int getRightArea(Info[] list, int num) {if (num > list[list.length - 1].value) {return -1;}int left = 0;int right = list.length - 1;while (left < right) {int mid = (left + right) / 2;if (list[mid].value > num) {right = mid;} else if (list[mid].value < num) {left = mid + 1;} else {return list[mid].index;}}return list[left].index;}private class Info {int value;int index;public Info(int index, int value) {this.index = index;this.value = value;}}
}

2.2 测试结果

通过测试
测试结果

3.总结

  • 使用 Info 类维护第一列和行的关系,并按照值进行排序
  • 使用二分查找法对第二列的数进行查找

http://www.ppmy.cn/news/271347.html

相关文章

Leetcode刷题 | 二分查找篇 | 436

目录 436. Find Right Interval方法一 二分查找1 方法思想2 代码实现3 复杂度分析4 涉及到知识点 方法二 双指针 436. Find Right Interval 题目链接&#xff1a;https://leetcode.cn/problems/find-right-interval/ 方法一 二分查找 1 方法思想 建立一个二维数组&#xff…

AcWing 436. 立体图

小渊是个聪明的孩子&#xff0c;他经常会给周围的小朋友们将写自己认为有趣的内容。最近&#xff0c;他准备给小朋友们讲解立体图&#xff0c;请你帮他画出立体图。 小渊有一块面积为 mn 的矩形区域&#xff0c;上面有 mn 个边长为 1 的格子&#xff0c;每个格子上堆了一些同样…

#423

第一次参加CF比赛T^T真是惊险刺激啊&#xff01;大佬太多了&#xff01;&#xff01;&#xff01;膜拜大佬&#xff01; A. Restaurant Tables time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output In a small res…

Day435436.支付系统 -谷粒商城

支付系统 一、基本概念 1、加密 ①对称加密 什么是对称加密 所谓对称加密&#xff0c;就是发送方要给接收方在网络上发送一段明文&#xff0c;但是不能直接发。 发送方需要加密&#xff0c;对称加密指的就是加密和解密用的是同一把密钥。 假设发送方准备了一串明文&#…

LeetCode-436. 寻找右区间【双指针】

题目描述&#xff1a; 给你一个区间数组 intervals &#xff0c;其中 intervals[i] [starti, endi] &#xff0c;且每个 starti 都 不同 。 区间 i 的 右侧区间 可以记作区间 j &#xff0c;并满足 startj > endi &#xff0c;且 startj 最小化 。 返回一个由每个区间 i…

439

1&#xff0e;政治   具体来说&#xff0c;政治共有六门课程需要复习&#xff0c;工作量大&#xff0c;任务较重。从历年考研试卷出题的情况看&#xff0c;六门课程在试卷中所占比重并不平均&#xff0c;所以我认为要根据各门课程的不同特点合理安排复习时间。 首先&#xf…

436分复试被刷!山东大学软件学院

山东大学是一所985大学&#xff0c;位于山东省省会济南市&#xff0c;计算机学科评估B&#xff0c;软件工程学科评估B&#xff0c;在985大学中排名中游&#xff0c;水平还不错。 今天来聊一下&#xff0c;山东大学软件学院的情况。 首先是2021考研的招生目录&#xff1a; 图片来…