Skip to content

Commit e4eef32

Browse files
committed
一刷436
1 parent d2bc1a1 commit e4eef32

File tree

5 files changed

+83
-54
lines changed

5 files changed

+83
-54
lines changed

README.adoc

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3078,12 +3078,12 @@ TIP: **公众号的微信号是: `jikerizhi`**。__因为众所周知的原因
30783078
|Medium
30793079
|
30803080

3081-
//|{counter:codes}
3082-
//|{leetcode_base_url}/find-right-interval/[436. Find Right Interval^]
3083-
//|{source_base_url}/_0436_FindRightInterval.java[Java]
3084-
//|{doc_base_url}/0436-find-right-interval.adoc[题解]
3085-
//|Medium
3086-
//|
3081+
|{counter:codes}
3082+
|{leetcode_base_url}/find-right-interval/[436. Find Right Interval^]
3083+
|{source_base_url}/_0436_FindRightInterval.java[Java]
3084+
|{doc_base_url}/0436-find-right-interval.adoc[题解]
3085+
|Medium
3086+
|
30873087

30883088
|{counter:codes}
30893089
|{leetcode_base_url}/path-sum-iii/[437. Path Sum III^]

docs/0436-find-right-interval.adoc

Lines changed: 40 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,65 +1,53 @@
11
[#0436-find-right-interval]
2-
= 436. Find Right Interval
2+
= 436. 寻找右区间
33

4-
{leetcode}/problems/find-right-interval/[LeetCode - Find Right Interval^]
4+
https://leetcode.cn/problems/find-right-interval/[LeetCode - 436. 寻找右区间^]
55

6-
Given a set of intervals, for each of the interval i, check if there exists an interval j whose start point is bigger than or equal to the end point of the interval i, which can be called that j is on the "right" of i.
6+
给你一个区间数组 `intervals`,其中 `intervals[i] = [start~i~, end~i~]`,且每个 `start~i~`*不同*
77

8-
For any interval i, you need to store the minimum interval j's index, which means that the interval j has the minimum start point to build the "right" relationship for interval i. If the interval j doesn't exist, store -1 for the interval i. Finally, you need output the stored value of each interval as an array.
8+
区间 `i`*右侧区间* 可以记作区间 `j` ,并满足 `start~j~ >= end~i~` ,且 `start~j~` *最小化* 。注意 `i` 可能等于 `j`
99

10-
*Note:*
10+
返回一个由每个区间 `i`*右侧区间*`intervals` 中对应下标组成的数组。如果某个区间 `i` 不存在对应的 *右侧区间*,则下标 `i` 处的值设为 `-1`
1111

12+
*示例 1:*
1213

13-
. You may assume the interval's end point is always bigger than its start point.
14-
. You may assume none of these intervals have the same start point.
14+
....
15+
输入:intervals = [[1,2]]
16+
输出:[-1]
17+
解释:集合中只有一个区间,所以输出-1。
18+
....
1519

20+
*示例 2:*
1621

17-
22+
....
23+
输入:intervals = [[3,4],[2,3],[1,2]]
24+
输出:[-1,0,1]
25+
解释:对于 [3,4] ,没有满足条件的“右侧”区间。
26+
对于 [2,3] ,区间[3,4]具有最小的“右”起点;
27+
对于 [1,2] ,区间[2,3]具有最小的“右”起点。
28+
....
1829

19-
*Example 1:*
30+
*示例 3:*
2031

21-
[subs="verbatim,quotes,macros"]
22-
----
23-
*Input:* [ [1,2] ]
24-
25-
*Output:* [-1]
26-
27-
*Explanation:* There is only one interval in the collection, so it outputs -1.
28-
----
29-
30-
32+
....
33+
输入:intervals = [[1,4],[2,3],[3,4]]
34+
输出:[-1,2,-1]
35+
解释:对于区间 [1,4] 和 [3,4] ,没有满足条件的“右侧”区间。
36+
对于 [2,3] ,区间 [3,4] 有最小的“右”起点。
37+
....
3138

32-
*Example 2:*
33-
34-
[subs="verbatim,quotes,macros"]
35-
----
36-
*Input:* [ [3,4], [2,3], [1,2] ]
37-
38-
*Output:* [-1, 0, 1]
39-
40-
*Explanation:* There is no satisfied "right" interval for [3,4].
41-
For [2,3], the interval [3,4] has minimum-"right" start point;
42-
For [1,2], the interval [2,3] has minimum-"right" start point.
43-
----
39+
*提示:*
4440

45-
41+
* `1 \<= intervals.length \<= 2 * 10^4^`
42+
* `+intervals[i].length == 2+`
43+
* `-10^6^ \<= start~i~ \<= end~i~ \<= 10^6^`
44+
* 每个间隔的起点都 *不相同*
4645
47-
*Example 3:*
48-
49-
[subs="verbatim,quotes,macros"]
50-
----
51-
*Input:* [ [1,4], [2,3], [3,4] ]
52-
53-
*Output:* [-1, 2, -1]
54-
55-
*Explanation:* There is no satisfied "right" interval for [1,4] and [3,4].
56-
For [2,3], the interval [3,4] has minimum-"right" start point.
57-
----
58-
59-
*NOTE:* input types have been changed on April 15, 2019. Please reset to default code definition to get new method signature.
6046
6147
== 思路分析
6248

49+
排序+二分查找。由于左端点都不同,可以根据左端点的值来来对区间进行排序。然后在这个有序序列中,查找右端点的“最近左端点”。
50+
6351
[[src-0436]]
6452
[tabs]
6553
====
@@ -77,8 +65,14 @@ include::{sourcedir}/_0436_FindRightInterval.java[tag=answer]
7765
// --
7866
// [{java_src_attr}]
7967
// ----
80-
// include::{sourcedir}/_0005_LongestPalindromicSubstring_2.java[tag=answer]
68+
// include::{sourcedir}/_0436_FindRightInterval_2.java[tag=answer]
8169
// ----
8270
// --
8371
====
8472

73+
74+
== 参考资料
75+
76+
. https://leetcode.cn/problems/find-right-interval/solutions/1506129/by-ac_oier-sijp/[436. 寻找右区间 - 一题双解 :「排序 + 二分」&「双指针(莫队思想)」^]
77+
. https://leetcode.cn/problems/find-right-interval/solutions/1504095/xun-zhao-you-qu-jian-by-leetcode-solutio-w2ic/[436. 寻找右区间 - 官方题解^]
78+
. https://leetcode.cn/problems/find-right-interval/solutions/52077/er-fen-cha-zhao-hong-hei-shu-by-liweiwei1419/[436. 寻找右区间 - 二分查找、二分搜索树^]

docs/index.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -957,7 +957,7 @@ include::0434-number-of-segments-in-a-string.adoc[leveloffset=+1]
957957

958958
include::0435-non-overlapping-intervals.adoc[leveloffset=+1]
959959

960-
// include::0436-find-right-interval.adoc[leveloffset=+1]
960+
include::0436-find-right-interval.adoc[leveloffset=+1]
961961

962962
include::0437-path-sum-iii.adoc[leveloffset=+1]
963963

logbook/202503.adoc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1349,6 +1349,10 @@ endif::[]
13491349
|{doc_base_url}/0435-non-overlapping-intervals.adoc[题解]
13501350
|❌ 贪心算法。换个角度,改为计算最多可以选多少个互不重叠的区间。
13511351

1352+
|{counter:codes2503}
1353+
|{leetcode_base_url}/find-right-interval/[436. 寻找右区间^]
1354+
|{doc_base_url}/0436-find-right-interval.adoc[题解]
1355+
|❌ 排序+二分查找。由于左端点都不同,可以根据左端点的值来来对区间进行排序。然后在这个有序序列中,查找右端点的“最近左端点”。
13521356

13531357
|===
13541358

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,41 @@
11
package com.diguage.algo.leetcode;
22

3+
import java.util.Arrays;
4+
import java.util.Comparator;
5+
36
public class _0436_FindRightInterval {
47
// tag::answer[]
58
/**
69
* @author D瓜哥 · https://www.diguage.com
7-
* @since 2024-08-29 20:49:07
10+
* @since 2025-08-16 16:16:17
811
*/
12+
public int[] findRightInterval(int[][] intervals) {
13+
int length = intervals.length;
14+
Integer[] index = new Integer[length];
15+
for (int i = 0; i < length; i++) {
16+
index[i] = i;
17+
}
18+
Arrays.sort(index, Comparator.comparingInt((Integer a) -> intervals[a][0]));
19+
int[] result = new int[length];
20+
for (int i = 0; i < length; i++) {
21+
int target = intervals[i][1];
22+
int left = 0, right = length - 1;
23+
while (left < right) {
24+
int mid = left + (right - left) / 2;
25+
int start = intervals[index[mid]][0];
26+
if (start >= target) {
27+
right = mid;
28+
} else {
29+
left = mid + 1;
30+
}
31+
}
32+
result[i] = target <= intervals[index[left]][0] ? index[left] : -1;
33+
}
34+
return result;
35+
}
936
// end::answer[]
37+
public static void main(String[] args) {
38+
new _0436_FindRightInterval()
39+
.findRightInterval(new int[][]{{3, 4}, {2, 3}, {1, 2}});
40+
}
1041
}

0 commit comments

Comments
 (0)