Skip to content

Commit cd3a929

Browse files
committed
feat: add solutions to lc problem: No.0435
No.0435.Non-overlapping Intervals
1 parent 6176166 commit cd3a929

File tree

9 files changed

+158
-85
lines changed

9 files changed

+158
-85
lines changed

Diff for: README.md

+1
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@
6767
- [摘樱桃](/solution/0700-0799/0741.Cherry%20Pickup/README.md) - 线性 DP、数字三角形模型
6868
- [摘樱桃 II](/solution/1400-1499/1463.Cherry%20Pickup%20II/README.md) - 线性 DP、数字三角形模型
6969
- [最长递增子序列](/solution/0300-0399/0300.Longest%20Increasing%20Subsequence/README.md) - 线性 DP、最长上升子序列模型
70+
- [无重叠区间](/solution/0400-0499/0435.Non-overlapping%20Intervals/README.md) - 线性 DP、最长上升子序列模型、贪心优化
7071
- [删列造序 III](/solution/0900-0999/0960.Delete%20Columns%20to%20Make%20Sorted%20III/README.md) - 线性 DP、最长上升子序列模型
7172
- [俄罗斯套娃信封问题](/solution/0300-0399/0354.Russian%20Doll%20Envelopes/README.md) - 线性 DP、最长上升子序列模型、贪心优化
7273
- [堆叠长方体的最大高度](/solution/1600-1699/1691.Maximum%20Height%20by%20Stacking%20Cuboids/README.md) - 排序、线性 DP、最长上升子序列模型

Diff for: README_EN.md

+1
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ Complete solutions to [LeetCode](https://leetcode.com/problemset/all/), [LCOF](h
6666
- [Cherry Pickup](/solution/0700-0799/0741.Cherry%20Pickup/README_EN.md) - Linear problem
6767
- [Cherry Pickup II](/solution/1400-1499/1463.Cherry%20Pickup%20II/README_EN.md) - Linear problem
6868
- [Longest Increasing Subsequence](/solution/0300-0399/0300.Longest%20Increasing%20Subsequence/README_EN.md) - Linear problem, LIS
69+
- [Non-overlapping Intervals](/solution/0400-0499/0435.Non-overlapping%20Intervals/README_EN.md) - Linear problem, LIS, Greedy
6970
- [Delete Columns to Make Sorted III](/solution/0900-0999/0960.Delete%20Columns%20to%20Make%20Sorted%20III/README_EN.md) - Linear problem, LIS
7071
- [Russian Doll Envelopes](/solution/0300-0399/0354.Russian%20Doll%20Envelopes/README_EN.md) - Linear problem, LIS
7172
- [Maximum Height by Stacking Cuboids](/solution/1600-1699/1691.Maximum%20Height%20by%20Stacking%20Cuboids/README_EN.md) - Sort, Linear problem, LIS

Diff for: solution/0400-0499/0435.Non-overlapping Intervals/README.md

+57-13
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,11 @@
4848

4949
<!-- 这里可写通用的实现逻辑 -->
5050

51-
贪心。
51+
**方法一:转换为最长上升子序列问题**
52+
53+
最长上升子序列问题,动态规划的做法,时间复杂度是 O(n²),这里可以采用贪心优化,将复杂度降至 O(nlogn)。
54+
55+
**方法二:排序 + 贪心**
5256

5357
先按照区间右边界排序。优先选择最小的区间的右边界作为起始边界。遍历区间:
5458

@@ -57,6 +61,8 @@
5761

5862
最后返回 ans 即可。
5963

64+
时间复杂度 O(nlogn)。
65+
6066
<!-- tabs:start -->
6167

6268
### **Python3**
@@ -66,8 +72,6 @@
6672
```python
6773
class Solution:
6874
def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
69-
if not intervals:
70-
return 0
7175
intervals.sort(key=lambda x: x[1])
7276
ans, t = 0, intervals[0][1]
7377
for s, e in intervals[1:]:
@@ -78,16 +82,27 @@ class Solution:
7882
return ans
7983
```
8084

85+
```python
86+
class Solution:
87+
def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
88+
intervals.sort()
89+
d = [intervals[0][1]]
90+
for s, e in intervals[1:]:
91+
if s >= d[-1]:
92+
d.append(e)
93+
else:
94+
idx = bisect_left(d, s)
95+
d[idx] = min(d[idx], e)
96+
return len(intervals) - len(d)
97+
```
98+
8199
### **Java**
82100

83101
<!-- 这里可写当前语言的特殊实现逻辑 -->
84102

85103
```java
86104
class Solution {
87105
public int eraseOverlapIntervals(int[][] intervals) {
88-
if (intervals == null || intervals.length == 0) {
89-
return 0;
90-
}
91106
Arrays.sort(intervals, Comparator.comparingInt(a -> a[1]));
92107
int t = intervals[0][1], ans = 0;
93108
for (int i = 1; i < intervals.length; ++i) {
@@ -102,16 +117,49 @@ class Solution {
102117
}
103118
```
104119

120+
```java
121+
class Solution {
122+
public int eraseOverlapIntervals(int[][] intervals) {
123+
Arrays.sort(intervals, (a, b) -> {
124+
if (a[0] != b[0]) {
125+
return a[0] - b[0];
126+
}
127+
return a[1] - b[1];
128+
});
129+
int n = intervals.length;
130+
int[] d = new int[n + 1];
131+
d[1] = intervals[0][1];
132+
int size = 1;
133+
for (int i = 1; i < n; ++i) {
134+
int s = intervals[i][0], e = intervals[i][1];
135+
if (s >= d[size]) {
136+
d[++size] = e;
137+
} else {
138+
int left = 1, right = size;
139+
while (left < right) {
140+
int mid = (left + right) >> 1;
141+
if (d[mid] >= s) {
142+
right = mid;
143+
} else {
144+
left = mid + 1;
145+
}
146+
}
147+
d[left] = Math.min(d[left], e);
148+
}
149+
}
150+
return n - size;
151+
}
152+
}
153+
```
154+
105155
### **TypeScript**
106156

107157
```ts
108158
function eraseOverlapIntervals(intervals: number[][]): number {
109-
let n = intervals.length;
110-
if (n == 0) return 0;
111159
intervals.sort((a, b) => a[1] - b[1]);
112160
let end = intervals[0][1],
113161
ans = 0;
114-
for (let i = 1; i < n; ++i) {
162+
for (let i = 1; i < intervals.length; ++i) {
115163
let cur = intervals[i];
116164
if (end > cur[0]) {
117165
ans++;
@@ -129,7 +177,6 @@ function eraseOverlapIntervals(intervals: number[][]): number {
129177
class Solution {
130178
public:
131179
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
132-
if (intervals.empty()) return 0;
133180
sort(intervals.begin(), intervals.end(), [](const auto &a, const auto &b) { return a[1] < b[1]; });
134181
int ans = 0, t = intervals[0][1];
135182
for (int i = 1; i < intervals.size(); ++i)
@@ -146,9 +193,6 @@ public:
146193
147194
```go
148195
func eraseOverlapIntervals(intervals [][]int) int {
149-
if intervals == nil || len(intervals) == 0 {
150-
return 0
151-
}
152196
sort.Slice(intervals, func(i, j int) bool {
153197
return intervals[i][1] < intervals[j][1]
154198
})

Diff for: solution/0400-0499/0435.Non-overlapping Intervals/README_EN.md

+50-12
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,6 @@ Greedy.
5151
```python
5252
class Solution:
5353
def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
54-
if not intervals:
55-
return 0
5654
intervals.sort(key=lambda x: x[1])
5755
ans, t = 0, intervals[0][1]
5856
for s, e in intervals[1:]:
@@ -63,14 +61,25 @@ class Solution:
6361
return ans
6462
```
6563

64+
```python
65+
class Solution:
66+
def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
67+
intervals.sort()
68+
d = [intervals[0][1]]
69+
for s, e in intervals[1:]:
70+
if s >= d[-1]:
71+
d.append(e)
72+
else:
73+
idx = bisect_left(d, s)
74+
d[idx] = min(d[idx], e)
75+
return len(intervals) - len(d)
76+
```
77+
6678
### **Java**
6779

6880
```java
6981
class Solution {
7082
public int eraseOverlapIntervals(int[][] intervals) {
71-
if (intervals == null || intervals.length == 0) {
72-
return 0;
73-
}
7483
Arrays.sort(intervals, Comparator.comparingInt(a -> a[1]));
7584
int t = intervals[0][1], ans = 0;
7685
for (int i = 1; i < intervals.length; ++i) {
@@ -85,16 +94,49 @@ class Solution {
8594
}
8695
```
8796

97+
```java
98+
class Solution {
99+
public int eraseOverlapIntervals(int[][] intervals) {
100+
Arrays.sort(intervals, (a, b) -> {
101+
if (a[0] != b[0]) {
102+
return a[0] - b[0];
103+
}
104+
return a[1] - b[1];
105+
});
106+
int n = intervals.length;
107+
int[] d = new int[n + 1];
108+
d[1] = intervals[0][1];
109+
int size = 1;
110+
for (int i = 1; i < n; ++i) {
111+
int s = intervals[i][0], e = intervals[i][1];
112+
if (s >= d[size]) {
113+
d[++size] = e;
114+
} else {
115+
int left = 1, right = size;
116+
while (left < right) {
117+
int mid = (left + right) >> 1;
118+
if (d[mid] >= s) {
119+
right = mid;
120+
} else {
121+
left = mid + 1;
122+
}
123+
}
124+
d[left] = Math.min(d[left], e);
125+
}
126+
}
127+
return n - size;
128+
}
129+
}
130+
```
131+
88132
### **TypeScript**
89133

90134
```ts
91135
function eraseOverlapIntervals(intervals: number[][]): number {
92-
let n = intervals.length;
93-
if (n == 0) return 0;
94136
intervals.sort((a, b) => a[1] - b[1]);
95137
let end = intervals[0][1],
96138
ans = 0;
97-
for (let i = 1; i < n; ++i) {
139+
for (let i = 1; i < intervals.length; ++i) {
98140
let cur = intervals[i];
99141
if (end > cur[0]) {
100142
ans++;
@@ -112,7 +154,6 @@ function eraseOverlapIntervals(intervals: number[][]): number {
112154
class Solution {
113155
public:
114156
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
115-
if (intervals.empty()) return 0;
116157
sort(intervals.begin(), intervals.end(), [](const auto &a, const auto &b) { return a[1] < b[1]; });
117158
int ans = 0, t = intervals[0][1];
118159
for (int i = 1; i < intervals.size(); ++i)
@@ -129,9 +170,6 @@ public:
129170
130171
```go
131172
func eraseOverlapIntervals(intervals [][]int) int {
132-
if intervals == nil || len(intervals) == 0 {
133-
return 0
134-
}
135173
sort.Slice(intervals, func(i, j int) bool {
136174
return intervals[i][1] < intervals[j][1]
137175
})
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
1-
class Solution {
2-
public:
3-
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
4-
if (intervals.empty()) return 0;
5-
sort(intervals.begin(), intervals.end(), [](const auto &a, const auto &b) { return a[1] < b[1]; });
6-
int ans = 0, t = intervals[0][1];
7-
for (int i = 1; i < intervals.size(); ++i)
8-
{
9-
if (t <= intervals[i][0]) t = intervals[i][1];
10-
else ++ans;
11-
}
12-
return ans;
13-
}
1+
class Solution {
2+
public:
3+
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
4+
sort(intervals.begin(), intervals.end(), [](const auto &a, const auto &b) { return a[1] < b[1]; });
5+
int ans = 0, t = intervals[0][1];
6+
for (int i = 1; i < intervals.size(); ++i)
7+
{
8+
if (t <= intervals[i][0]) t = intervals[i][1];
9+
else ++ans;
10+
}
11+
return ans;
12+
}
1413
};
+13-16
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,14 @@
1-
func eraseOverlapIntervals(intervals [][]int) int {
2-
if intervals == nil || len(intervals) == 0 {
3-
return 0
4-
}
5-
sort.Slice(intervals, func(i, j int) bool {
6-
return intervals[i][1] < intervals[j][1]
7-
})
8-
t, ans := intervals[0][1], 0
9-
for i := 1; i < len(intervals); i++ {
10-
if intervals[i][0] >= t {
11-
t = intervals[i][1]
12-
} else {
13-
ans++
14-
}
15-
}
16-
return ans
1+
func eraseOverlapIntervals(intervals [][]int) int {
2+
sort.Slice(intervals, func(i, j int) bool {
3+
return intervals[i][1] < intervals[j][1]
4+
})
5+
t, ans := intervals[0][1], 0
6+
for i := 1; i < len(intervals); i++ {
7+
if intervals[i][0] >= t {
8+
t = intervals[i][1]
9+
} else {
10+
ans++
11+
}
12+
}
13+
return ans
1714
}
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,14 @@
1-
class Solution {
2-
public int eraseOverlapIntervals(int[][] intervals) {
3-
if (intervals == null || intervals.length == 0) {
4-
return 0;
5-
}
6-
Arrays.sort(intervals, Comparator.comparingInt(a -> a[1]));
7-
int t = intervals[0][1], ans = 0;
8-
for (int i = 1; i < intervals.length; ++i) {
9-
if (intervals[i][0] >= t) {
10-
t = intervals[i][1];
11-
} else {
12-
++ans;
13-
}
14-
}
15-
return ans;
16-
}
1+
class Solution {
2+
public int eraseOverlapIntervals(int[][] intervals) {
3+
Arrays.sort(intervals, Comparator.comparingInt(a -> a[1]));
4+
int t = intervals[0][1], ans = 0;
5+
for (int i = 1; i < intervals.length; ++i) {
6+
if (intervals[i][0] >= t) {
7+
t = intervals[i][1];
8+
} else {
9+
++ans;
10+
}
11+
}
12+
return ans;
13+
}
1714
}
+10-12
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
1-
class Solution:
2-
def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
3-
if not intervals:
4-
return 0
5-
intervals.sort(key=lambda x: x[1])
6-
ans, t = 0, intervals[0][1]
7-
for s, e in intervals[1:]:
8-
if s >= t:
9-
t = e
10-
else:
11-
ans += 1
12-
return ans
1+
class Solution:
2+
def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
3+
intervals.sort(key=lambda x: x[1])
4+
ans, t = 0, intervals[0][1]
5+
for s, e in intervals[1:]:
6+
if s >= t:
7+
t = e
8+
else:
9+
ans += 1
10+
return ans

Diff for: solution/0400-0499/0435.Non-overlapping Intervals/Solution.ts

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
function eraseOverlapIntervals(intervals: number[][]): number {
2-
let n = intervals.length;
3-
if (n == 0) return 0;
42
intervals.sort((a, b) => a[1] - b[1]);
53
let end = intervals[0][1],
64
ans = 0;
7-
for (let i = 1; i < n; ++i) {
5+
for (let i = 1; i < intervals.length; ++i) {
86
let cur = intervals[i];
97
if (end > cur[0]) {
108
ans++;

0 commit comments

Comments
 (0)