leetcode 436. Find Right Interval | 436. 寻找右区间(二分查找不小于某值的第一个位置)

news/2024/11/22 21:13:16/

题目

https://leetcode.com/problems/find-right-interval/
在这里插入图片描述

题解

这题考察点不难,就是个普通的二分查找。详细过程是:

因为 start 是唯一的,所以先用 map 存储每一个 start 的对应下标。然后根据 start 的大小,对数组进行排序,方便二分查找。
最后,对于未排序数组中的每一个 end 值,分别在排序好的数组中,找到不小于 end[i] 的第一个元素。需要注意的是,找到的位置不能是 i 本身。
在这里插入图片描述

思路很朴素,但是二分查找的细节比较耗时,而且每次都花很长时间在扣边界上。等有时间看下别人的边界的写法。

class Solution {public int[] findRightInterval(int[][] arr) {int L = arr.length;HashMap<Integer, Integer> map = new HashMap<>();map.put(-1, -1);int[] end = new int[L];for (int i = 0; i < L; i++) {end[i] = arr[i][1];map.put(arr[i][0], i);}Arrays.sort(arr, Comparator.comparingInt(o -> o[0])); // start is uniqueint[] result = new int[L];for (int i = 0; i < L; i++) {result[i] = binarySearch(arr, end[i], 0, L - 1, i, map);}return result;}public int binarySearch(int[][] arr, int target, int L, int R, int i, HashMap<Integer, Integer> map) {if (arr[R][0] < target) return -1;// 只看(start,?),找第一个start不小于target的位置while (L < R) {int M = L + ((R - L) >> 1);if (arr[M][0] == target) {return map.get(arr[M][0]);} else if (arr[M][0] < target) {L = M + 1;} else {// 保右端点if (R == M) return map.get(arr[M][0]);R = M;}}if (map.get(arr[L][0]) == i) L += 1; // 目标位置不能是i位置本身if (L >= arr.length) return -1;else return map.get(arr[L][0]);}
}

在这里插入图片描述


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

相关文章

#436. 子串的最大差(单调栈)

题目链接 http://oj.daimayuan.top/problem/436 题面 思路 我们考虑每一个点作为一个区间最小值和区间最大值的次数&#xff0c;那么我们可以从两边延申&#xff0c;对于区间最小值而言找到左边第一个大于自身的数&#xff0c;对于右边也找到大于第一个大于自身的数&#xf…

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

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

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…