粗暴解法 :
维持一个结果集合,遍历数组,每一个判断是否能加入结果集合中更新结果集合,时间复杂度nn
优化分析:
时间复杂度较高的原因是前一个元素的判断结果不能促进后一个元素的判断 ,判断是否需要合并实质上元素大小的判断->排序,以每个数组的前区间基准升序排序,时间复杂度 nlogn
解法:
- 排序
- 维持一个判断集合,遍历数组,
- 每个数组中的前区间小于等于判断集合后区间,则可合并 ->后区间同时大于判断集合后区间,合并判断集合(注意需要考虑前一个元素数组包含后一个元素数组情况)
- 每个数组中的前区间大于判断集合后区间->后面不会再有可以合并的区间,判断集合入结果
代码
fun merge(intervals: Array<IntArray>): Array<IntArray> {
intervals.sortBy { it[0] }
val result = mutableListOf<IntArray>()
var begin = intervals[0][0]
var end = intervals[0][1]
intervals.forEach { array ->
if(array[0] <= end ){
array[1].takeIf { num -> num > end }?.let { end = it } //需注意前一个包含后一个情况
}
else{
result.add(intArrayOf(begin,end))
begin = array[0]
end = array[1]
}
}
result.add(intArrayOf(begin,end))
return result.toTypedArray()
}