LeetCode刷题——寻找右区间#436#Medium

news/2024/11/22 14:56:09/

寻找右区间的思路探讨与源码
    寻找右区间的题目如下图,该题属于数组类和搜索类型的题目,主要考察对于搜索方法的使用和数组结构的理解。本文的题目作者想到2种方法,分别是双指针方法和二分查找方法,其中双指针方法使用Java进行编写,而二分查找方法使用Python进行编写,当然这可能不是最优的解法,还希望各位大佬给出更快的算法。
在这里插入图片描述
    本人认为该题目可以使用双指针方法的思路进行解决,首先计算数组的长度,并初始化两个长度和数组等长的宽度为2的二维数组,然后开始遍历二维数组并进行赋值,把原始数组的第一列元素和下标赋值给第一个二维数组,把原始数组的第二列元素和下标赋值给第二个二维数组,再将两个二维数组进行排序。初始化一个1维数组,开始遍历循环并进行搜索,如果满足条件就把下标加1,如果下标小于数组长度,就把第一个数组的第二列值赋值给对应位置的1维数组,否则就赋值为-1,直到遍历结束并返回该数组。那么按照这个思路我们的Java代码如下:

#喷火龙与水箭龟
class Solution {public int[] findRightInterval(int[][] intervals) {int numLen = intervals.length;int[][] startIntervals = new int[numLen][2];int[][] endIntervals = new int[numLen][2];for (int ir = 0; ir < numLen; ir++) {startIntervals[ir][0] = intervals[ir][0];startIntervals[ir][1] = ir;endIntervals[ir][0] = intervals[ir][1];endIntervals[ir][1] = ir;}Arrays.sort(startIntervals, (o1, o2) -> o1[0] - o2[0]);Arrays.sort(endIntervals, (o1, o2) -> o1[0] - o2[0]);int[] res = new int[numLen];for (int ic = 0, jc = 0; ic < numLen; ic++) {while (jc < numLen && endIntervals[ic][0] > startIntervals[jc][0]) {jc = jc + 1;}if (jc < numLen) {res[endIntervals[ic][1]] = startIntervals[jc][1];} else {res[endIntervals[ic][1]] = -1;}}return res;}
}

在这里插入图片描述
    显然,我们的双指针方法的效果一般,还可以用二分查找方法进行解决。首先遍历数组并把数组的下标加入到数组的末尾,将数组进行排序。计算数组的长度,初始化一个和数组长度一样的元素都是-1的数组,开始遍历循环,使用二分库查找函数找到下标,判断下标是否小于数组长度,如果是的话就把数组的元素赋值给一维数组的对应元素,按照这个思路直到遍历结束并返回结果。所以按照这个思路就可以解决,下面是Python代码:

#喷火龙与水箭龟
class Solution:def findRightInterval(self, intervals: List[List[int]]) -> List[int]:for ir, interval in enumerate(intervals):interval.append(ir)intervals.sort()numLen = len(intervals)res = [-1] * numLenfor _, end, id in intervals:ir = bisect_left(intervals, [end])if(ir < numLen):res[id] = intervals[ir][2]return res

在这里插入图片描述
    从结果来说Java版本的双指针方法的效率一般,而Python版本的二分查找方法的速度比较不错,但应该是有更多的方法可以进一步提速的,希望朋友们能够多多指教,非常感谢。


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

相关文章

【Leetcode】436. Find Right Interval

题目地址&#xff1a; https://leetcode.com/problems/find-right-interval/description/ 给定 n n n个区间组成的数组 A A A&#xff0c;对每个数组&#xff0c;求左端点大于等于其右端点且左端点最靠左的区间的下标。题目保证每个区间左端点各不相同。 记录一下每个左端点…

LeetCode 436. 寻找右区间

436. 寻找右区间 【二分】我们将左端点和下标组成一个元祖&#xff0c;按照左端点从小到大排序&#xff0c;然后对每个区间寻找>右端点的最小值即可。 二分查找的时候注意当nums[mid]>target的时候我们就往左边找&#xff0c;这样结束后左边都是<target的值&#xff…

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

题目 https://leetcode.com/problems/find-right-interval/ 题解 这题考察点不难&#xff0c;就是个普通的二分查找。详细过程是&#xff1a; 因为 start 是唯一的&#xff0c;所以先用 map 存储每一个 start 的对应下标。然后根据 start 的大小&#xff0c;对数组进行排序…

#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…