-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathMergeIntervals.kt
71 lines (60 loc) · 2.42 KB
/
MergeIntervals.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
package questions
import _utils.UseCommentAsDocumentation
import utils.assertIterableSame
import kotlin.math.exp
import kotlin.math.max
/**
* Given an array of intervals where `intervals[i] = [starti, endi]`, merge all overlapping intervals,
* and return an array of the non-overlapping intervals that cover all the intervals in the input.
*
* [Source](https://leetcode.com/problems/merge-intervals/)
*/
@UseCommentAsDocumentation
private fun merge(intervals: Array<IntArray>): Array<IntArray> {
if (intervals.size == 1) return intervals
sortIntervalsByFirstElement(intervals) // sort ascending
val result = arrayListOf<IntArray>()
for (i in 1..intervals.lastIndex) {
val prev = result.lastOrNull() ?: intervals[0] // to compare with last element in the result
val current = intervals[i]
if (current[0] <= prev[1]) { // has overlap
if (result.isNotEmpty()) {
result.removeAt(result.lastIndex) // remove the last added
}
val mergeInterval = intArrayOf(prev[0], max(current[1], prev[1])) // merge
result.add(mergeInterval)
} else {
// if no overlaps
if (result.isEmpty()) {
result.add(prev) // in case of first element in interval
}
result.add(current)
}
}
return result.toTypedArray()
}
private fun sortIntervalsByFirstElement(intervals: Array<IntArray>) {
intervals.sortBy { it[0] }
}
fun main() {
assertIterableSame(
actual = merge(arrayOf(intArrayOf(1, 4), intArrayOf(0, 2), intArrayOf(3, 5))).toList(),
expected = arrayOf(intArrayOf(0, 5)).toList()
)
assertIterableSame(
actual = merge(arrayOf(intArrayOf(1, 4), intArrayOf(2, 3))).toList(),
expected = arrayOf(intArrayOf(1, 4)).toList()
)
assertIterableSame(
actual = merge(arrayOf(intArrayOf(1, 4), intArrayOf(5, 6))).toList(),
expected = arrayOf(intArrayOf(1, 4), intArrayOf(5, 6)).toList()
)
assertIterableSame(
actual = merge(arrayOf(intArrayOf(1, 3), intArrayOf(2, 6), intArrayOf(8, 10), intArrayOf(15, 18))).toList(),
expected = arrayOf(intArrayOf(1, 6), intArrayOf(8, 10), intArrayOf(15, 18)).toList()
)
assertIterableSame(
actual = merge(arrayOf(intArrayOf(1, 4), intArrayOf(4, 5))).toList(),
expected = arrayOf(intArrayOf(1, 5)).toList()
)
}