leetcode hard模式专杀之57. Insert Interval
2017-06-08 14:11
274 查看
这题思路 不算难,但同样是要注意边界条件, high level的思路是如果新插入的interval没有任何overlap,那就直接插入,否则,就通过如下方式合并:删掉所有的有overlap的interval,再插入一个新的interval
那么问题来了,如何确定哪些是overlap的interval, 新的interval又是从哪儿到哪儿?
要回答这两个问题,通过两次循环遍历足矣,上代码:
/**
* 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 int compare(Interval interval, int pos){
if(pos<interval.start){
// point to the left
return -1;
}else if(pos<=interval.end){
// in the interval
return 0;
}else{
// point to the right
return 1;
}
}
public List<Interval> insert(List<Interval> intervals, Interval newInterval) {
int startPos = 0;
int endPos = 0;
int mergeStart = newInterval.start;
int mergeEnd = newInterval.end;
boolean rightOverlap = false;
int i = 0;
for(i = 0 ; i<intervals.size(); i++){
Interval current = intervals.get(i);
int comp = compare(current, newInterval.start);
if(comp==1){
continue;
}else if(comp==0){
startPos = i;
mergeStart = current.start;
break;
}else{
startPos = i;
mergeStart = newInterval.start;
break;
}
}
// move all the way to the end
if(i==intervals.size()){
intervals.add(intervals.size(), newInterval);
return intervals;
}
for(i = 0 ; i<intervals.size(); i++){
Interval current = intervals.get(i);
int comp = compare(current, newInterval.end);
if(comp==1){
continue;
}else if(comp==0){
endPos = i;
mergeEnd = current.end;
rightOverlap = true;
break;
}else{
endPos = i;
mergeEnd = newInterval.end;
break;
}
}
if(i==intervals.size()){
endPos = i;
}
// has overlap
if(rightOverlap){
//delete from startPos to endPos and insert a new interval
for(i =0 ; i< endPos-startPos+1; i++){
intervals.remove(startPos);
}
intervals.add(startPos, new Interval(mergeStart, mergeEnd));
}else{
// delete from startPos to endPos-1 and insert a new interval
for(i=0; i<endPos-startPos; i++){
intervals.remove(startPos);
}
intervals.add(startPos, new Interval(mergeStart, mergeEnd));
}
return intervals;
}
}
那么问题来了,如何确定哪些是overlap的interval, 新的interval又是从哪儿到哪儿?
要回答这两个问题,通过两次循环遍历足矣,上代码:
/**
* 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 int compare(Interval interval, int pos){
if(pos<interval.start){
// point to the left
return -1;
}else if(pos<=interval.end){
// in the interval
return 0;
}else{
// point to the right
return 1;
}
}
public List<Interval> insert(List<Interval> intervals, Interval newInterval) {
int startPos = 0;
int endPos = 0;
int mergeStart = newInterval.start;
int mergeEnd = newInterval.end;
boolean rightOverlap = false;
int i = 0;
for(i = 0 ; i<intervals.size(); i++){
Interval current = intervals.get(i);
int comp = compare(current, newInterval.start);
if(comp==1){
continue;
}else if(comp==0){
startPos = i;
mergeStart = current.start;
break;
}else{
startPos = i;
mergeStart = newInterval.start;
break;
}
}
// move all the way to the end
if(i==intervals.size()){
intervals.add(intervals.size(), newInterval);
return intervals;
}
for(i = 0 ; i<intervals.size(); i++){
Interval current = intervals.get(i);
int comp = compare(current, newInterval.end);
if(comp==1){
continue;
}else if(comp==0){
endPos = i;
mergeEnd = current.end;
rightOverlap = true;
break;
}else{
endPos = i;
mergeEnd = newInterval.end;
break;
}
}
if(i==intervals.size()){
endPos = i;
}
// has overlap
if(rightOverlap){
//delete from startPos to endPos and insert a new interval
for(i =0 ; i< endPos-startPos+1; i++){
intervals.remove(startPos);
}
intervals.add(startPos, new Interval(mergeStart, mergeEnd));
}else{
// delete from startPos to endPos-1 and insert a new interval
for(i=0; i<endPos-startPos; i++){
intervals.remove(startPos);
}
intervals.add(startPos, new Interval(mergeStart, mergeEnd));
}
return intervals;
}
}
相关文章推荐
- leetcode hard模式专杀之76 Minimum Window Substring
- leetcode hard模式专杀之55. Jump Game
- leetcode hard模式专杀之42. Trapping Rain Water
- leetcode hard模式专杀之51. N-Queens
- leetcodehard 模式专杀之85. Maximal Rectangle
- leetcode hard模式专杀之68. Text Justification
- leetcode hard模式专杀之23 merge k sorted lists
- leetcode hard模式专杀之52 N-Queens II
- leetcode hard模式专杀之295. Find Median from Data Stream
- leetcode hard模式专杀之233. Number of Digit One
- leetcode hard模式专杀之10Regular Expression Matching
- Leetcode 56. Merge Intervals && 57. Insert Interval(Hard)
- leetcode hard模式专杀之25 Reverse Nodes in k-Group
- leetcode hard模式专杀之41 First Missing Positive
- leetcode hard模式专杀之99. Recover Binary Search Tree
- leetcode hard模式专杀之72. Edit Distance
- Leetcode 57. Insert Interval (Medium) (java)
- leetcode - 57. Insert Interval
- [Leetcode]57. Insert Interval
- leetcode-57. Insert Interval