2013-12-16 44 views
-1

是否有任何简单的方法来定义两个数字对的重叠范围? 例如, Pair1 = [360,780] Pair2 = [420,800]两个数字对的重叠范围

答案是[420,780]

+1

'result = {max(pair1 [0],pair2 [0]),min(pair1 [1],pair2 [1])}' – reto

+0

检查第一个示例http://community.topcoder。 com/tc?module = Static&d1 = tutorials&d2 = greedyAlg –

回答

2

确保您的间隔重叠。

然后取两个对的上限和下限的最大值。

int lower = Math.max(myPair1.x1, myPair2.x1); 
int upper = Math.min(myPair1.x2, myPair2.x2); 

if(lower < upper) 
    return new Pair(lower, upper) 
else 
    throw new CustomException("Intervals not overlap") 
+0

有没有什么快速的方法来检查间隔是否重叠? –

+0

您必须检查新时间间隔的下限是否低于新时间间隔的上限 – user2336315

0

如何:

int from = Math.max(pair1.getX(), pair2.getX()); 
int to = Math.min(pair1.getY(), pair2.getY()); 

if (from <= to) { 
    return new Pair(from, to); 
} else { 
    return null; 
} 
+0

不应该是从<=到?一个元素范围也是有效的。 –

+0

这取决于。但我已经更新了我的答案:) – BobTheBuilder

1

我会创造像

class Range { 
    final int start; 
    final int end; 
    private Range(int start; int end) { this.start = start; this.end = end; } 
    public static Range of(int start, int end) { return new Range(start, end); } 
    public Range and(Range r) { 
     return new Range(Math.max(start, r.start), Math.min(end, r.end); 
    } 
} 

一类你可以写

Range one = Range.of(360, 780); 
Range two = Range.of(420, 800); 
Range both = one.and(two); 
+2

如果没有重叠怎么办? – BobTheBuilder

+0

@whoAmI在这种情况下,'end' <'start',你得到一个无效的范围。你如何处理这取决于你想要做什么。例如它可以在构造函数中抛出一个异常。 –

0

有点的java.awt.geom误用,试试吧:

public static double[] createIntersection(double[] a1, double[] a2) { 
    Rectangle2D r1 = new Rectangle2D.Double(), r2 = new Rectangle2D.Double(); 
    r1.setFrameFromDiagonal(a1[0], 0, a1[1], 1); 
    r2.setFrameFromDiagonal(a2[0], 0, a2[1], 1); 
    Rectangle2D r3 = r1.createIntersection(r2); 
    return new double[] { r3.getMinX(), r3.getMaxX() }; 
} 
+1

似乎过于简单的任务。 – user2336315