详细见:leetcode.com/problems/insert-interval
Java Solution: github
package leetcode;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
public class P057_InsertInterval {
public static void main(String[] args) {
// List<Integer> zxw = new ArrayList<Integer>();
// zxw.add(0);
// zxw.add(1);
// zxw.add(2);
// zxw.add(3);
// zxw.add(4);
// zxw.add(4, 1999);
// tools.Utils.B_打印List_Integer(zxw);
// for (int i = -2; i < 20; i ++) {
List<Interval> input = generate(new int[][] {
// {1,4}, {10,14},{19,25},{29,34}
{1,4}
});
Interval newInterval = new Interval(2, 100);
new Solution().insert(input, newInterval);
print(input);
// System.out.println(i + "..." + new Solution().getIndexBEEnd(input, newInterval));
// new Solution().getIndex(input, newInterval);
// }
}
/*
* 二分
* 2 ms
* 95.54%
* 经验证,leetcode上的List都是ArrayList
*/
static class Solution {
public List<Interval> insert(List<Interval> intervals, Interval newInterval) {
if (intervals == null) {
intervals = new LinkedList<Interval>();
intervals.add(newInterval);
return intervals;
}
if (intervals.size() == 0) {
intervals.add(newInterval);
return intervals;
}
int sti = getIndexGEStart(intervals, newInterval);
int eni = getIndexBEEnd(intervals, newInterval);
if (sti == -1) {
intervals.add(0, new Interval(newInterval.start, Math.min(intervals.get(0).start, newInterval.end)));
sti ++;
eni ++;
}
if (eni == intervals.size()) {
intervals.add(eni, new Interval(Math.max(intervals.get(eni - 1).end, newInterval.start), newInterval.end));
}
Interval interval_sti = intervals.get(sti);
Interval interval_eni = intervals.get(eni);
if (sti == eni) {
return intervals;
} else if (sti > eni) {
} else {
if (newInterval.start > interval_sti.end) {
if (newInterval.end < interval_eni.start) {
for (int i = eni - 1; i > sti; i --)
intervals.remove(i);
intervals.add(sti + 1, newInterval);
} else {
intervals.get(eni).start = newInterval.start;
for (int i = eni - 1; i > sti; i --)
intervals.remove(i);
}
} else {
if (newInterval.end < interval_eni.start) {
interval_sti.end = newInterval.end;
for (int i = eni - 1; i > sti; i --)
intervals.remove(i);
} else {
interval_sti.end = interval_eni.end;
for (int i = eni; i > sti; i --)
intervals.remove(i);
}
}
}
return intervals;
}
/*
* newInterval.start >= intervals.get(ans).start
*/
int getIndexGEStart(List<Interval> intervals, Interval newInterval) {
int sti = 0, eni = intervals.size() - 1;
if (newInterval.start >= intervals.get(eni).start)
return eni;
while (sti < eni) {
int mid = (sti + eni) >> 1;
int temp = intervals.get(mid).start - newInterval.start;
if (temp > 0) {
eni = mid;
} else if (temp == 0) {
return mid;
} else {
sti = mid + 1;
}
}
return sti - 1;
}
/*
* newInterval.end <= intervals.get(ans).end
*/
int getIndexBEEnd(List<Interval> intervals, Interval newInterval) {
int sti = 0, eni = intervals.size() - 1;
if (intervals.get(sti).end >= newInterval.end)
return sti;
while (sti < eni) {
int mid = ((sti + eni) >> 1) + 1;
int temp = intervals.get(mid).end - newInterval.end;
if (temp > 0 ) {
eni = mid - 1;
} else if (temp == 0) {
return mid;
} else {
sti = mid;
}
}
return sti + 1;
}
}
static class Interval {
int start;
int end;
Interval() { start = 0; end = 0; }
Interval(int s, int e) { start = s; end = e; }
}
static List<Interval> generate(int[][] input) {
List<Interval> ans = new LinkedList<Interval>();
for (int i = 0; i != input.length; i ++)
ans.add(new Interval(input[i][0], input[i][1]));
return ans;
}
static void print(List<Interval> ans) {
Iterator<Interval> it = ans.iterator();
while (it.hasNext()) {
Interval temp = it.next();
System.out.println(temp.start + "..." + temp.end);
}
}
}
C Solution: github
/*
url: leetcode.com/problems/insert-interval
AC 9ms 37.50%
*/
#include <stdio.h>
#include <stdlib.h>
typedef struct Interval si;
struct Interval {
int start;
int end;
};
int cmp_real(si* n, int ni, int nn, int val) {
si *n1 = NULL, *n2 = NULL;
if (ni % 2 == 0) {
n1 = ni / 2 == 0 ? NULL : n + (ni / 2 - 1);
n2 = ni / 2 == nn ? NULL : n + (ni / 2);
if (n1 != NULL && n1->end >= val) return -1;
if (n2 != NULL && n2->start <= val) return 1;
return 0;
} else {
n1 = n + (ni / 2);
if (val < n1->start) return -1;
if (val > n1->end) return 1;
return 0;
}
}
int state(si* n, int nn, int val) {
int i = 0, j = 2 * nn, m = 0, cmp_val = 0;
while (i < j) {
m = i + (j - i) / 2;
cmp_val = cmp_real(n, m, nn, val);
if (cmp_val == 0) return m;
else if (cmp_val < 0) {
j = m - 1;
} else {
i = m + 1;
}
}
return i;
}
si* insert(si* n, int nn, si new_n, int* rn) {
int i = state(n, nn, new_n.start);
int j = state(n, nn, new_n.end);
int k = 0, cut = 0, v = 0;
int r1 = 0, r2 = 0, ai = 0;
si* ans = NULL;
if (i == j) {
if (i % 2 == 0) {
ans = (si*) malloc(sizeof(si) * (nn + 1));
r1 = i/2-1;
r2 = i/2;
ai = 0;
for (v = 0; v <= r1; v ++)
ans[ai ++] = n[v];
ans[ai ++] = new_n;
for (v = r2; v < nn; v ++)
ans[ai ++] = n[v];
*rn = nn+1;
return ans;
} else {
*rn = nn;
return n;
}
}
r1 = i/2-1;
r2 = (j+1)/2;
if (i%2 == 1) new_n.start = n[i/2].start;
if (j%2 == 1) new_n.end = n[j/2].end;
ans = (si*) malloc(sizeof(si) * (nn + r1 - r2 + 2));
ai = 0;
for (v = 0; v <= r1; v ++)
ans[ai ++] = n[v];
ans[ai ++] = new_n;
for (v = r2; v < nn; v ++)
ans[ai ++] = n[v];
*rn = nn + r1 - r2 + 2;
return ans;
}
int main() {
si n[5];
int i = 0;
int rn = 0;
si* ans = NULL;
int nn = 5;
si new_n;
new_n.start = -1;
new_n.end = -1;
n[0].start = 1;
n[0].end = 2;
n[1].start = 3;
n[1].end = 5;
n[2].start = 6;
n[2].end = 7;
n[3].start = 8;
n[3].end = 10;
n[4].start = 12;
n[4].end = 16;
//for (i = -1; i < 19; i ++)
//printf("i is %d small is %d\r\n", i, state(n, nn, i));
ans = insert(n, nn, new_n, &rn);
printf("answer size is %d\r\n", rn);
for (i = 0; i < rn; i ++)
printf("start is %d end is %d\r\n", ans[i].start, ans[i].end);
//free(ans);
return 0;
}
Python Solution: github
#coding=utf-8
'''
url: leetcode.com/problems/insert-interval
@author: zxwtry
@email: zxwtry@qq.com
@date: 2017年4月11日
@details: Solution: 102ms 26.38%
'''
class Interval(object):
def __init__(self, s=0, e=0):
self.start = s
self.end = e
def print_Interval(i):
for j in range(len(i)):
print("%d: %d\t%d" % (j, i[j].start, i[j].end))
class Solution(object):
def cmp(self, n, ni, nn, val):
if ni % 2 == 0:
n1 = None if ni//2 == 0 else n[ni//2-1]
n2 = None if ni//2 == nn else n[ni//2]
if n1 != None and n1.end >= val: return -1;
if n2 != None and n2.start <= val: return 1;
return 0
else:
n1 = n[ni//2]
if val < n1.start: return -1
if val > n1.end: return 1
return 0
def state(self, n, nn, val):
i, j = 0, 2*nn
while i < j:
m = i + (j - i) // 2
cmp_val = self.cmp(n, m, nn, val)
if cmp_val == 0: return m
if cmp_val < 0: j=m-1
else: i = m+1
return i
def insert(self, n, new_n):
"""
:type n: List[Interval]
:type new_n: Interval
:rtype: List[Interval]
"""
nn = 0 if n == None else len(n)
i = self.state(n, nn, new_n.start)
j = self.state(n, nn, new_n.end)
if i == j:
if i%2 == 0:
n.insert(i//2, new_n)
return n
r1, r2 = i//2-1, (j+1)//2
if i%2==1: new_n.start = n[i//2].start
if j%2==1: new_n.end = n[j//2].end
for k in range(r1+1, r2):
n.remove(n[r1+1])
n.insert(r1+1, new_n)
return n
if __name__ == "__main__":
i0 = Interval(1,2)
i1 = Interval(3,5)
i2 = Interval(6,7)
i3 = Interval(8,10)
i4 = Interval(12,16)
# i5 = Interval(1, 3)
i = [i0, i1, i2, i3, i4]
# i = [i0, i1]
new_n = Interval(4,9)
print_Interval(Solution().insert(i, new_n))


被折叠的 条评论
为什么被折叠?



