Skip to content

Commit 9d65c79

Browse files
solves insert inrterval
1 parent d51ba19 commit 9d65c79

File tree

2 files changed

+55
-0
lines changed

2 files changed

+55
-0
lines changed

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
| 54 | [Spiral Matrix](https://leetcode.com/problems/spiral-matrix) | [![Java](assets/java.png)](src/SpiralMatrix.java) | |
5656
| 55 | [Jump Game](https://leetcode.com/problems/jump-game) | [![Java](assets/java.png)](src/JumpGame.java) | |
5757
| 56 | [Merge Intervals](https://leetcode.com/problems/merge-intervals) | [![Java](assets/java.png)](src/MergeIntervals.java) | |
58+
| 57 | [Insert Interval](https://leetcode.com/problems/insert-interval) | [![Java](assets/java.png)](src/InsertInterval.java) | |
5859
| 58 | [Length of Last Word](https://leetcode.com/problems/length-of-last-word) | [![Java](assets/java.png)](src/LengthOfLastWord.java) [![Python](assets/python.png)](python/length_of_last_word.py) | |
5960
| 66 | [Plus One](https://leetcode.com/problems/plus-one) | [![Java](assets/java.png)](src/PlusOne.java) [![Python](assets/python.png)](python/plus_one.py) | |
6061
| 67 | [Add Binary](https://leetcode.com/problems/add-binary) | [![Java](assets/java.png)](src/AddBinary.java) [![Python](assets/python.png)](python/add_binary.py) | |

src/InsertInterval.java

+54
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
// https://leetcode.com/problems/insert-interval/submissions
2+
// T: O(n)
3+
// S: O(n)
4+
5+
public class InsertInterval {
6+
public int[][] insert(int[][] intervals, int[] newInterval) {
7+
if (intervals.length == 0) return new int[][] {newInterval};
8+
final int startIndex = search(intervals, newInterval[0]);
9+
final int endIndex = search(intervals, newInterval[1]);
10+
final int newStart = startIndex >= intervals.length
11+
? newInterval[0]
12+
: Math.min(intervals[startIndex][0], newInterval[0]);
13+
final int newEnd = endIndex >= intervals.length
14+
? newInterval[1]
15+
: newInterval[1] >= intervals[endIndex][0] ? intervals[endIndex][1] : newInterval[1];
16+
final boolean hasMerged = hasMerged(intervals, newInterval, startIndex, endIndex);
17+
final int intervalMergedEnd = endIndex >= intervals.length
18+
? intervals.length - 1
19+
: newInterval[1] >= intervals[endIndex][0] ? endIndex : endIndex - 1;
20+
final int intervalMergedStart = startIndex;
21+
final int elements = intervals.length - (hasMerged ? intervalMergedEnd - intervalMergedStart : -1);
22+
final int[][] result = new int[elements][2];
23+
int i = 0;
24+
for ( ; i < intervalMergedStart ; i++) result[i] = intervals[i];
25+
result[i++] = new int[] {newStart, newEnd};
26+
if (hasMerged) {
27+
for (i = intervalMergedEnd + 1 ; i < intervals.length ; i++) {
28+
result[i - (intervalMergedEnd - intervalMergedStart)] = intervals[i];
29+
}
30+
} else {
31+
for ( ; i < intervals.length ; i++) {
32+
result[i] = intervals[i - 1];
33+
}
34+
}
35+
return result;
36+
}
37+
38+
private boolean hasMerged(int[][] intervals, int[] interval, int start, int end) {
39+
if (start >= intervals.length) return false;
40+
return interval[0] <= intervals[start][1] ||
41+
(end < intervals.length && interval[1] >= intervals[end][0]);
42+
}
43+
44+
private int search(int[][] array, int x) {
45+
int left = 0, right = array.length - 1, middle;
46+
while (left <= right) {
47+
middle = left + (right - left) / 2;
48+
if (array[middle][1] == x) return middle;
49+
else if (array[middle][1] > x) right = middle - 1;
50+
else left = middle + 1;
51+
}
52+
return left;
53+
}
54+
}

0 commit comments

Comments
 (0)