Maximal Interval

题目:
给定一连串区间,找出一个time stamp出现在interval的次数最多。

题目分析:
这道题主要就是用两个array来分别存储结果和count的端点。对于start和end相同的interval要做特殊处理。

代码:

public class MaximalInterval {

    public static void main(String[] args){
        Interval i1 = new Interval(1, 3);
        Interval i2 = new Interval(2, 6);
        Interval i3 = new Interval(4, 7);
        Interval i4 = new Interval(5, 8);
        Interval i5 = new Interval(2, 2);
        Interval[] input = new Interval[5];
        input[0] = i1;
        input[1] = i2;
        input[2] = i3;
        input[3] = i4;
        input[4] = i5;
        MaximalInterval maximalInterval = new MaximalInterval();
        List<Interval> rst = maximalInterval.getMaximalInterval(input);
        maximalInterval.print(rst);
    }
    static class Interval{
        int start;
        int end;
        public Interval(int start, int end){
            this.start = start;
            this.end = end;
        }
    }
    public List<Interval> getMaximalInterval(Interval[] intervals){
        if(intervals == null || intervals.length == 0){
            return null;
        }
        int max = Integer.MIN_VALUE;
        for(int i = 0; i <= intervals.length - 1; i++){
            max = Math.max(intervals[i].end, max);
        }
        int[] temp = new int[max + 1];
        // handle interval with same start and end
        for(int i = 0; i <= intervals.length - 1; i++){
            if(intervals[i].start == intervals[i].end){
                temp[intervals[i].start] += 1;
            }
        }
        int[] helper = new int[max + 1];
        for(int i = 0; i <= intervals.length - 1; i++){
            helper[intervals[i].start] += 1;
            helper[intervals[i].end] -= 1;
        }
        int counter = 0;
        int maxCount = 0;
        for(int i = 1; i <= max; i++){
            if(helper[i] > 0){
                counter += 1;
                temp[i] += counter;
                maxCount = Math.max(maxCount, counter);
            }
            else if(helper[i] < 0){
                temp[i] += counter;
                counter -= 1;
            }
            else{
                temp[i] += counter;
            }
        }
        Interval tempInterval = new Interval(-1, -1);
        List<Interval> rst = new ArrayList<>();
        for(int i = 1; i <= max; i++){
            if(temp[i] == maxCount){
                if(temp[i - 1] != maxCount){
                    tempInterval.start = i;
                }
                if(i == max || temp[i + 1] != maxCount){
                    tempInterval.end = i;
                    rst.add(new Interval(tempInterval.start, tempInterval.end));
                }
            }
        }
        return rst;
    }
    public void print(List<Interval> intervals){
        for(int i = 0; i <= intervals.size() - 1; i++){
            System.out.println("start: " + intervals.get(i).start + " end: " + intervals.get(i).end);
        }
    }
}






Comments

Popular Posts