class Solution {
fun merge(intervals: Array<IntArray>): Array<IntArray> {
if (intervals.isEmpty()) {
return arrayOf()
}
if (intervals.size == 1) {
return intervals
}
intervals.sortBy { it[0] }
if (intervals.size == 2) {
if (isTwoArrayMergeable(intervals[0], intervals[1])) {
return arrayOf(
mergeTwoIntArray(intervals[0], intervals[1])
)
}
return intervals
}
val answer: MutableList<IntArray> = mutableListOf()
var cur = intervals[0]
var nextIndex = 1
while (nextIndex < intervals.size) {
if (isTwoArrayMergeable(cur, intervals[nextIndex])) {
cur = mergeTwoIntArray(cur, intervals[nextIndex])
} else {
answer.add(cur)
cur = intervals[nextIndex]
}
nextIndex++
}
answer.add(cur)
return answer.toTypedArray()
}
private fun isTwoArrayMergeable(left: IntArray, right: IntArray): Boolean {
return left[1] >= right[0] || left[0] >= right[1]
}
private fun mergeTwoIntArray(left: IntArray, right: IntArray): IntArray {
return intArrayOf(
min(left[0], right[0]),
max(left[1], right[1])
)
}
}