57. 插入区间 - Kotlin 合并区间 模拟
Problem: 57. 插入区间
思路
由于题干指明了原区间序列是有序且无重叠的,可以为我们省去许多功夫
我们用一个min和一个max记录当前合并区间的左边界和右边界,且初始化为newInterval
的左边界和右边界
顺序遍历intervals
,可以对遍历到的interval
分为两种情况:
- 当
interval
和当前的合并区间无重叠部分时,可以直接将interval
添加至结果res
中
- 当
interval
和当前的合并区间有重叠部分时,即interval
可以和当前的合并区间再次合并,新的合并区间中左边界min
应当取interval[0]
和min
中较小的一个,右边界max
应当取interval[1]
和max
中较大的一个
由于intervals
本身是有序的,当interval
不再满足该条件时,即可将合并区间[min,max]
插入res
中
复杂度
Code
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
| class Solution fun Solution.insert(intervals: Array<IntArray>, newInterval: IntArray): Array<IntArray> { if (intervals.size == 0) return arrayOf(newInterval)
val res = ArrayList<IntArray>() var min = newInterval[0] var max = newInterval[1] var flag = false var done = false
for (interval in intervals) { if ((interval[0] <= min && interval[1] >= min) || (interval[0] <= max && interval[1] >= max) || (interval[0] >= min && interval[1] <= max) ) { min = Math.min(min, interval[0]) max = Math.max(max, interval[1]) flag = true } else if (flag) { res.add(intArrayOf(min, max)) res.add(interval) flag = false done = true } else { res.add(interval) } } if (!done) { res.add(intArrayOf(min, max)) }
return res.sortedBy { it[0] }.toTypedArray() }
|