Skip to content

Commit 985d27b

Browse files
committed
Add and organize new interval problems and notes
1 parent 5074a0d commit 985d27b

File tree

7 files changed

+214
-193
lines changed

7 files changed

+214
-193
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ This project offers a curated collection of notes and resources covering fundame
1919
- [Dynamic Programming](./topics/dynamic-programming.md)
2020
- [Greedy](./topics/greedy.md)
2121
- [Shortest Path](./topics/shortest-path.md)
22+
- [Interval](./topics/interval.md)
2223
- [Backtracking](./topics/backtracking.md)
2324

2425
## Problems & Solutions

leetcode/56.merge-intervals.md

Lines changed: 28 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -18,33 +18,34 @@ The idea is that we sort the array first by the `start`, so that we can iterate
1818
[1, 10], [15, 18]
1919
```
2020

21-
For two intervals `merged` and `toMerge`, there are four cases:
22-
* **Fully Overlapped**: To merge.
23-
* **Partially Overlapped**: To merge.
24-
* **Adjacent**: It's still overlapped, to merge.
25-
* **No Overlap**: To keep both, `[x, y]` and `[z, w]` => `[x, y]` and `[z, w]`, and move to the next interval.
26-
2721
To merge the two intervals, we just need to keep the smaller `start` and the larger `end`, that is `min(merged[0], toMerge[0]), max(merged[1], toMerge[1])`
2822

2923
```js
30-
// Fully Overlapped, just keep the longer interval [1, 4]
31-
[1 4]
32-
[2 3]
33-
// Or
34-
[2 3]
35-
[1 4]
36-
37-
// Partially Overlapped, merged, [1, 5]
38-
[1 4]
39-
[3 5]
40-
// Or
41-
[3 5]
42-
[1 4]
43-
44-
// Adjacent, extended, [1, 5]
45-
[1 4][4 5]
46-
47-
// No Overlap, keep both, [1, 4][6, 8]
24+
// 1. Fully Overlapped: just keep the longer interval [1, 4]
25+
1 2 3 4 5 6 7 8
26+
|--------|
27+
|--|
28+
29+
// Merged:
30+
1--------4
31+
32+
// 2. Partially Overlapped: merged, [1, 5]
33+
1 2 3 4 5 6 7 8
34+
|--------|
35+
|-----|
36+
37+
// Merged:
38+
1-----------5
39+
40+
// 3. Adjacent: extended, [1, 5]
41+
1 2 3 4 5 6 7 8
42+
|--------|
43+
|--|
44+
45+
// Merged:
46+
1-----------5
47+
48+
// 4. No Overlap: keep both, [1, 4][6, 8]
4849
[1 4] [6 8]
4950
```
5051

@@ -58,18 +59,7 @@ fun merge(intervals: Array<IntArray>): Array<IntArray> {
5859
results.add(merged)
5960
for (i in 1 until intervals.size) {
6061
val toMerge = intervals[i]
61-
// Overlapped
62-
// |---| merged
63-
// |-------| toMerge
64-
// |-------| toMerge
65-
//
66-
// We don't have to consider this case, because we have sorted the intervals by `start`.
67-
// |-----| merged
68-
// |------| toMerge
69-
70-
// Or we can use the following function to check if overlapped.
71-
// if (overlapped(merged, toMerge)) {
72-
if (toMerge[0] <= merged[1]) {
62+
if (isOverlapped(merged, toMerge)) {
7363
merged[0] = minOf(merged[0], toMerge[0])
7464
merged[1] = maxOf(merged[1], toMerge[1])
7565
} else {
@@ -89,7 +79,7 @@ fun merge(intervals: Array<IntArray>): Array<IntArray> {
8979
for (i in 1 until intervals.size) {
9080
val toMerge = intervals[i]
9181

92-
if (overlapped(merged, toMerge)) {
82+
if (isOverlapped(merged, toMerge)) {
9383
merged[0] = minOf(merged[0], toMerge[0])
9484
merged[1] = maxOf(merged[1], toMerge[1])
9585
} else {
@@ -100,63 +90,7 @@ fun merge(intervals: Array<IntArray>): Array<IntArray> {
10090
results.add(merged)
10191
return results.toTypedArray()
10292
}
103-
104-
private fun overlapped(merged: IntArray, toMerge: IntArray): Boolean {
105-
// Not (Not overlapped) = Overlapped
106-
return !(
107-
merged[1] < toMerge[0] ||
108-
toMerge[1] < merged[0]
109-
)
110-
}
111-
112-
private fun overlapped(merged: IntArray, toMerge: IntArray): Boolean {
113-
// Case 1:
114-
// |----| merged
115-
// |------| toMerge
116-
117-
// Case 2:
118-
// |------|
119-
// |----|
120-
121-
// Case 3:
122-
// |---|
123-
// |---------|
124-
125-
// Case 4:
126-
// |---------|
127-
// |---|
128-
return (
129-
toMerge[0] in merged[0]..merged[1] || // Case 1
130-
merged[1] in toMerge[0]..toMerge[1] || // Case 2
131-
(toMerge[0] <= merged[0] && merged[1] <= toMerge[1]) || // Case 3
132-
(merged[0] <= toMerge[0] && toMerge[1] <= merged[1]) // Case 4
133-
)
134-
}
13593
```
13694

13795
* **Time Complexity**: `O(n lg n)` for sorting, `O(n)` to merge, total time is `O(n lg n)`.
138-
* **Space Complexity**: `O(lg n)` for sorting.
139-
140-
## Pitfalls
141-
There is a pitfall to check if two intervals are overlapped, we can't just check if `merged[0] < toMerge[1] || toMerged[0] < merged[1]`.
142-
143-
```js
144-
|-------| merged
145-
|-------| toMerge
146-
147-
|-------| merged
148-
|-------| toMerge
149-
```
150-
151-
It failed in the following cases:
152-
```js
153-
// toMerge[1] < merged[0], but they are overlapped.
154-
|-------| merged
155-
|-------| toMerge
156-
157-
// toMerge[0] < merged[1], but they are not overlapped.
158-
|-------| merged
159-
|-------| toMerge
160-
```
161-
162-
> See [729. My Calendar I](../leetcode/729.my-calendar-i.md)
96+
* **Space Complexity**: `O(lg n)` for sorting.

leetcode/57.insert-interval.md

Lines changed: 0 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -52,17 +52,6 @@ fun insert(intervals: Array<IntArray>, newInterval: IntArray): Array<IntArray> {
5252

5353
return results.toTypedArray()
5454
}
55-
56-
/**
57-
a: |----|
58-
b: |----|
59-
60-
a: |-----|
61-
b: |----|
62-
*/
63-
private fun isOverlapped(a: IntArray, b: IntArray): Boolean {
64-
return !(a[1] < b[0] || b[1] < a[0])
65-
}
6655
```
6756

6857
Or equivalently, we can use for loop to iterate through the intervals. (but more complex, not recommended)
@@ -96,30 +85,6 @@ fun insert(intervals: Array<IntArray>, newInterval: IntArray): Array<IntArray> {
9685
if (!isAdded) results.add(merged)
9786
return results.toTypedArray()
9887
}
99-
100-
/**
101-
a = [1,3]
102-
b = [2,5]
103-
*/
104-
private fun isOverlapped(a: IntArray, b: IntArray): Boolean {
105-
// Above: a
106-
// Below: b
107-
// |---|
108-
// |------|
109-
return b[0] in a[0]..a[1] ||
110-
111-
// |----|
112-
// |----|
113-
a[0] in b[0]..b[1] ||
114-
115-
// |----------|
116-
// |--|
117-
a[0] <= b[0] && b[1] <= a[1] ||
118-
119-
// |--|
120-
// |----------|
121-
b[0] <= a[0] && a[1] <= b[1]
122-
}
12388
```
12489

12590
* **Time Complexity**: `O(n)`.

leetcode/729.my-calendar-i.md

Lines changed: 0 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,5 @@
11
## [729. My Calendar I](https://leetcode.com/problems/my-calendar-i/description/)
22

3-
## Pitfalls
4-
```js
5-
// Pitfall:
6-
if (interval[0] < end || start < interval[1]) return overlapped
7-
8-
interval[0]
9-
^
10-
|-----| interval
11-
|-----| [start, end)
12-
*
13-
end
14-
|-----| // Also means `interval[0] < end`, but it's not overlapping.
15-
*
16-
end
17-
18-
interval[1]
19-
^
20-
|-----| interval
21-
|-----| [start, end)
22-
*
23-
start
24-
|-| // Also means `start < interval[1]`, but it's not overlapping.
25-
*
26-
start
27-
```
28-
29-
> See [56. Merge Intervals](../leetcode/56.merge-intervals.md)
30-
313
### Brute Force
324
```kotlin
335
class MyCalendar() {
@@ -38,25 +10,6 @@ class MyCalendar() {
3810
for (interval in intervals) {
3911
val noConflict = interval[1] <= start || end <= interval[0]
4012
if (!noConflict) return false
41-
42-
// Or equivalent to
43-
// |-----| interval
44-
// |------------| start <= interval[0] && interval[1] <= end
45-
46-
// Partical overlapped at `start`
47-
// |-----| interval
48-
// |--------- interval[0] <= start
49-
// |-----| start < interval[1]
50-
51-
// Partial overlapped at `end`
52-
// |-----| interval
53-
// |----| interval[0] < end
54-
// |---| end <= interval[1]
55-
if (
56-
(start <= interval[0] && interval[1] <= end) ||
57-
start in interval[0] until interval[1] ||
58-
end in interval[0] + 1..interval[1]
59-
) return false
6013
}
6114
intervals.add(intArrayOf(start, end))
6215
return true

problems/interval-problems.md

Lines changed: 52 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,61 @@
11
## Intervals
2+
### Basic
23
| Problem | Difficulty |
34
|------------------|------------|
4-
|[56. Merge Intervals](../leetcode/56.merge-intervals.md)|Medium|
5-
|[57. Insert Interval](../leetcode/57.insert-interval.md)|Medium|
5+
|**[56. Merge Intervals](../leetcode/56.merge-intervals.md)**|Medium|
6+
|**[57. Insert Interval](../leetcode/57.insert-interval.md)**|Medium|
67
|**[986. Interval List Intersections](../leetcode/986.interval-list-intersections.md)**|Medium|
7-
|[729. My Calendar I](../leetcode/729.my-calendar-i.md)|Medium|
8-
|[452. Minimum Number of Arrows to Burst Balloons](../leetcode/452.minimum-number-of-arrows-to-burst-balloons.md)|Medium|
9-
|[1094. Car Pooling](../leetcode/1094.car-pooling.md)|Medium|
8+
|**[729. My Calendar I](../leetcode/729.my-calendar-i.md)**|Medium|
9+
|[55. Jump Game](../leetcode/55.jump-game.md)|Medium|
10+
|**[1094. Car Pooling](../leetcode/1094.car-pooling.md)**|Medium|
1011
|[2779. Maximum Beauty of an Array After Applying Operation](../leetcode/2779.maximum-beauty-of-an-array-after-applying-operation.md)|Medium (1638)|
1112

12-
### Resources
13-
* Study guidelines: https://leetcode.com/discuss/study-guide/2166045/ (Problem listing: https://leetcode.com/problem-list/mzw3cyy6/)
14-
* [Greedy problem listing - 二、区间贪心](https://huxulm.github.io/lc-rating/list/greedy)
15-
* Video: https://www.bilibili.com/video/BV1qY411n7Qs/?vd_source=2f62e0e1762a6703c96771d3baa35968
13+
> * https://leetcode.com/problems/points-that-intersect-with-cars/description/ 1229
14+
> * https://leetcode.com/problems/check-if-all-the-integers-in-a-range-are-covered/description/ 1307
15+
> * https://leetcode.com/problems/maximum-population-year/description/ 1370
16+
> * https://leetcode.com/problems/count-days-without-meetings/description/ 1483
17+
> * **https://leetcode.com/problems/my-calendar-ii/description/** 2k m
18+
> * https://leetcode.com/problems/count-ways-to-group-overlapping-ranges/description/ 1631
19+
> * https://leetcode.com/problems/employee-free-time/description/ 1710 (Premium)
20+
> * **https://leetcode.com/problems/number-of-flowers-in-full-bloom/** 2022
21+
> * **https://leetcode.com/problems/my-calendar-iii/description/** h
22+
> * **https://leetcode.com/problems/maximum-profit-in-job-scheduling/**
23+
> * https://leetcode.com/problems/the-skyline-problem/description/ h
1624
17-
> * https://leetcode.cn/problems/my-calendar-i/solutions/1646264/by-jiang-hui-4-pyfn/
25+
### 2.1 不相交区间
26+
| Problem | Difficulty |
27+
|------------------|------------|
28+
> * https://leetcode.com/problems/maximum-length-of-pair-chain/description/ m
1829
> * https://leetcode.com/problems/non-overlapping-intervals/description/ 8k m
19-
> * https://leetcode.com/problems/number-of-flowers-in-full-bloom 1k h
20-
> * https://leetcode.com/problems/points-that-intersect-with-cars/description/
21-
> * https://leetcode.com/problems/my-calendar-ii/description/ 2k m
22-
> * https://leetcode.com/problems/maximum-profit-in-job-scheduling/
23-
> * https://leetcode.com/problems/number-of-flowers-in-full-bloom/
24-
> * https://leetcode.com/problems/maximum-population-year/description/ 1k e
30+
31+
### 2.2 区间分组
32+
| Problem | Difficulty |
33+
|------------------|------------|
2534
> * https://leetcode.com/problems/divide-intervals-into-minimum-number-of-groups 1713
26-
> * https://leetcode.com/problems/the-skyline-problem/description/ h
35+
> * https://leetcode.com/problems/meeting-rooms-ii/ (Premium)
36+
37+
### 2.3 区间选点
38+
| Problem | Difficulty |
39+
|------------------|------------|
40+
|**[452. Minimum Number of Arrows to Burst Balloons](../leetcode/452.minimum-number-of-arrows-to-burst-balloons.md)**|Medium|
41+
42+
### 2.4 区间覆盖
43+
| Problem | Difficulty |
44+
|------------------|------------|
45+
|[45. Jump Game II](../leetcode/45.jump-game-ii.md)|Medium|
46+
47+
> * https://leetcode.com/problems/video-stitching/description/ 1746
48+
> * https://leetcode.com/problems/minimum-number-of-taps-to-open-to-water-a-garden/description/ 1885
49+
50+
### 2.6 其他区间贪心
51+
| Problem | Difficulty |
52+
|------------------|------------|
53+
> * https://leetcode.com/problems/remove-covered-intervals/description/ 1375
54+
> * https://leetcode.com/problems/two-best-non-overlapping-events/description/ 1883
55+
> * https://leetcode.com/problems/maximum-number-of-events-that-can-be-attended/description/ 2015
56+
57+
### Resources
58+
*[Study guidelines](https://leetcode.com/discuss/study-guide/2166045/)
59+
*[Greedy problem listing - 二、区间贪心](https://huxulm.github.io/lc-rating/list/greedy)
60+
* [Video](https://www.bilibili.com/video/BV1qY411n7Qs/?vd_source=2f62e0e1762a6703c96771d3baa35968)
61+
* [Segment Tree](https://leetcode.cn/problems/my-calendar-i/solutions/1646264/by-jiang-hui-4-pyfn/)

0 commit comments

Comments
 (0)