LeetCode057 Insert Interval

详细见: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))


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值