菜鸡每日一题系列打卡57天
每天一道算法题目
小伙伴们一起留言打卡
坚持就是胜利,我们一起努力!
题目描述(引自LeetCode)
给出一个无重叠的,按照区间起始端点排序的区间列表。在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。
示例 1:
输入: intervals = [[1,3],[6,9]], newInterval = [2,5]
输出: [[1,5],[6,9]]
示例 2:
输入: intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]
输出: [[1,2],[3,10],[12,16]]
解释: 这是因为新的区间 [4,8] 与 [3,5],[6,7],[8,10] 重叠。
题目分析
这道题目与上一道题目有很多相似之处。但这道题目更进了一步,为了简化非核心步骤的操作,本题给出的数组是按起始端点排序的数组。依旧是采用贪心的解法,注意不同情况的处理即可。话不多说,上代码!
代码实现
class Solution {
public int[][] insert(int[][] intervals, int[] newInterval) {
int flag = 0;
LinkedList<int[]> tmp = new LinkedList<>();
while (flag < intervals.length && intervals[flag][0] <= newInterval[0]) tmp.add(intervals[flag++]);
if (tmp.isEmpty() || tmp.getLast()[1] < newInterval[0]) {
tmp.add(newInterval);
for (; flag < intervals.length && intervals[flag][0] <= newInterval[1]; flag++);
if (flag > 0) tmp.getLast()[1] = Math.max(newInterval[1], intervals[flag - 1][1]);
} else if (newInterval[1] > tmp.getLast()[1]) {
for (; flag < intervals.length && intervals[flag][0] <= newInterval[1]; flag++);
if (flag > 0) tmp.getLast()[1] = Math.max(newInterval[1], intervals[flag - 1][1]);
}
while (flag < intervals.length) tmp.add(intervals[flag++]);
return tmp.toArray(new int[0][]);
}
}
代码分析
对代码进行分析,仅仅对二维数组进行了一次遍历,因此,时间复杂度为O(n),而就空间而言,使用了额外的空间存储临时结果集,因此,空间复杂度为O(n)。
执行结果
学习 | 工作 | 分享
????长按关注“有理想的菜鸡”
只有你想不到,没有你学不到