Skip to content

Commit c8e8948

Browse files
add post '(Leetcode) 435 - Non-overlapping Intervals 풀이'
1 parent 38aeb8c commit c8e8948

File tree

1 file changed

+81
-0
lines changed

1 file changed

+81
-0
lines changed

_posts/2024-07-23-leetcode-435.md

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
---
2+
layout: post
3+
title: (Leetcode) 435 - Non-overlapping Intervals 풀이
4+
categories: [스터디-알고리즘]
5+
tags:
6+
[자바, java, 리트코드, Leetcode, 알고리즘, interval, array, greedy, sorting]
7+
date: 2024-07-23 04:30:00 +0900
8+
toc: true
9+
---
10+
11+
기회가 되어 [달레님의 스터디](https://github.com/DaleStudy/leetcode-study)에 참여하여 시간이 될 때마다 한문제씩 풀어보고 있다.
12+
13+
[https://neetcode.io/practice](https://neetcode.io/practice)
14+
15+
---
16+
17+
[https://leetcode.com/problems/non-overlapping-intervals/description/](https://leetcode.com/problems/non-overlapping-intervals/description/)
18+
19+
## 내가 작성한 풀이
20+
21+
먼저 입력으로 들어온 intervals를 정렬 한다.
22+
interval 간에 overlapping이 발생된 경우 end 값이 짧은 쪽을 택한다. 그래야 추후에 더 많은 interval을 선택할 수 있다.
23+
24+
```java
25+
public int eraseOverlapIntervals(int[][] intervals) {
26+
int overlappingCount = 0;
27+
Arrays.sort(intervals, Comparator.comparingInt(o -> o[1]));
28+
29+
for (int i = 0; i < intervals.length - 1; i++) {
30+
// overlapping 이 발생된 경우
31+
if (intervals[i][1] > intervals[i + 1][0]) {
32+
overlappingCount++;
33+
34+
// 앞 interval 의 end 값이 뒤 interval 의 end 보다 작을 경우 swap
35+
if (intervals[i][1] < intervals[i + 1][1]) {
36+
int[] temp = intervals[i];
37+
intervals[i] = intervals[i + 1];
38+
intervals[i + 1] = temp;
39+
}
40+
}
41+
}
42+
43+
return overlappingCount;
44+
}
45+
```
46+
47+
### TC, SC
48+
49+
시간 복잡도는 `O(n*logn)` 공간 복잡도는 `O(1)` 이다.
50+
51+
## swap 없이 pointer를 사용하여 풀기
52+
53+
첫번째 풀이는 swap이 필요하다. pointer를 통해서 개선할 수 있을 것으로 보여서 개선해보았다.
54+
55+
```java
56+
public int eraseOverlapIntervals(int[][] intervals) {
57+
int overlappingCount = 0;
58+
Arrays.sort(intervals, Comparator.comparingInt(o -> o[1]));
59+
60+
int currentEnd = intervals[0][1];
61+
for (int i = 0; i < intervals.length - 1; i++) {
62+
// overlapping 이 발생된 경우
63+
if (currentEnd > intervals[i + 1][0]) {
64+
overlappingCount++;
65+
66+
// 앞 interval 의 end 값이 뒤 interval 의 end 보다 작을 경우 이전 pointer 유지
67+
if (currentEnd < intervals[i + 1][1]) {
68+
continue;
69+
}
70+
}
71+
72+
currentEnd = intervals[i + 1][1];
73+
}
74+
75+
return overlappingCount;
76+
}
77+
```
78+
79+
### TC, SC
80+
81+
시간 복잡도는 `O(n*logn)` 공간 복잡도는 `O(1)` 이다.

0 commit comments

Comments
 (0)