給定正整數 N(如 10),找出所有滿足以下條件的正整數三元組 (a, b, c):
a + b + c < Na + b > c、a + c > b、b + c > a三重迴圈窮舉 a, b, c,範圍 1 ~ N-2。利用三角形不等式剪枝:假設 a ≤ b ≤ c,則只需判斷 a + b > c 即可,並可限制 c < a + b 且 a + b + c < N。
import java.util.ArrayList;
import java.util.List;
public class TriangleFinder {
public static List findTriangles(int maxPerimeter) {
List result = new ArrayList<>();
for (int a = 1; a <= maxPerimeter / 3; a++) {
for (int b = a; b <= (maxPerimeter - a) / 2; b++) {
int maxC = Math.min(a + b - 1, maxPerimeter - a - b - 1);
for (int c = b; c <= maxC; c++) {
if (a + b + c < maxPerimeter) {
result.add(new int[]{a, b, c});
}
}
}
}
return result;
}
public static void main(String[] args) {
List triangles = findTriangles(10);
for (int[] t : triangles) {
System.out.printf("(%d, %d, %d)%n", t[0], t[1], t[2]);
}
}
}
(1, 1, 1)
(1, 2, 2)
(2, 2, 2)
(2, 2, 3)
(1, 3, 3)
(2, 3, 3)
(3, 3, 3)
(2, 3, 4)
(1, 4, 4)
(2, 4, 4)
(3, 3, 4)
(3, 4, 4)
(4, 4, 4)
N 極大,可改用數學公式直接計算組合數,避免三重迴圈。parallelStream() 加速多核心環境。