57. Insert Interval-leetcode-java

【原来在SAE的blog上,都转到CSDN了。。】

57. Insert Interval-leetcode-java

题目:

Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessary).

You may assume that the intervals were initially sorted according to their start times.

Example 1:
Given intervals [1,3],[6,9], insert and merge [2,5] in as [1,5],[6,9].

Example 2:
Given [1,2],[3,5],[6,7],[8,10],[12,16], insert and merge [4,9] in as [1,2],[3,10],[12,16].

This is because the new interval [4,9] overlaps with [3,5],[6,7],[8,10].

这道题和leetcode 56题 merge intervals是兄弟题,这道题是给一系列interval的区间,这个区间是相互没有重叠的,这时候插入一个Interval  插入之后 若有重叠了,则进行合并。

思路:

先是新建结果集ls,判断原有集合intervals是否为空,若为空,直接把newInterval加入ls,返回。否则开始判断情况,遍历原有集合intervals,如果newInterval的end小于第i个interval的start,就把newInterval加入结果集ls;如果newInterval的start大于第i个的end,z则就把第i个加入结果集ls中,其他情况,则需要比较第i个和newInterval来进行合并。start选两者中最小的,end选两者中最大的。

开始自己写的时候,走入了一个误区,考虑着好多种情况啊,万一这个newInterval小于第0个,结果end不确定,可以排在最前面,可能需要合并两个,可能需要合并三个,还有start大于的情况,合并的情况这么多怎么办……试着写了几个if判断语句思路就狗带了。其实是自己想的太远了,虽说也是遍历着比较,但是自己想一下子把需要合并的情况弄出来。思路不明确。其实应该是在遍历intervals的循环中,一步一步的考虑,每一步只需要考虑这次是往结果集里加current 还是newInterval,还是需要合并一下这两个,循环结束经历过每一步的比较,也就出来结果了。

最后循环到最后一次,也就是intervals.size()-1的时候,进入这三种情况的比较之后,不会再进入循环了,最后再把这个newInterval加入结果集ls中。

/**
* Definition for an interval.
* public class Interval {
* int start;
* int end;
* Interval() { start = 0; end = 0; }
* Interval(int s, int e) { start = s; end = e; }
* }
*/
public class Solution {
public List<Interval> insert(List<Interval> intervals, Interval newInterval) {
List<Interval> ls = new ArrayList<Interval>();
if(intervals==null || intervals.size()<1) {
ls.add(newInterval); return ls;}

for(int i=0;i<intervals.size();i++){
Interval curr = intervals.get(i);
if(newInterval.end<curr.start){
ls.add(newInterval);
// ls.add(curr); //开始多了这句话,wrong answer
for(int j=i;j<intervals.size();j++){
ls.add(intervals.get(j));
}
break;
}else if(newInterval.start>curr.end){
ls.add(curr);
}else{
newInterval.start=Math.min(curr.start,newInterval.start);
newInterval.end=Math.max(curr.end,newInterval.end);
}
if(i==intervals.size()-1){
ls.add(newInterval);
}
}
return ls;
}
}

发表在 leetcode 标签有 javaleetcode 发表回复
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值