Maximal Interval
题目:
给定一连串区间,找出一个time stamp出现在interval的次数最多。
题目分析:
这道题主要就是用两个array来分别存储结果和count的端点。对于start和end相同的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
Post a Comment