2013-12-16 41 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