An array A consisting of N integers is given. A triplet (P, Q, R) is triangular if it is possible to build a triangle with sides of lengths A[P], A[Q] and A[R]. In other words, triplet (P, Q, R) is triangular if 0 ≤ P < Q < R < N and:
- A[P] + A[Q] > A[R],
- A[Q] + A[R] > A[P],
- A[R] + A[P] > A[Q].
For example, consider array A such that:
A[0] = 10 A[1] = 2 A[2] = 5 A[3] = 1 A[4] = 8 A[5] = 12There are four triangular triplets that can be constructed from elements of this array, namely (0, 2, 4), (0, 2, 5), (0, 4, 5), and (2, 4, 5).
Write a function:
class Solution { public int solution(int[] A); }
that, given an array A consisting of N integers, returns the number of triangular triplets in this array.
For example, given array A such that:
A[0] = 10 A[1] = 2 A[2] = 5 A[3] = 1 A[4] = 8 A[5] = 12the function should return 4, as explained above.
Write an efficient algorithm for the following assumptions:
- N is an integer within the range [0..1,000];
- each element of array A is an integer within the range [1..1,000,000,000].
import java.util.Arrays;
class Solution {
// Encapsulation
private int count = 0;
private int[] A;
public int solution(int[] A) {
this.A = A;
Arrays.sort(this.A);
for (int p = 0; p < A.length - 2; p++) {
int q = p + 1;
int r = q + 1;
while (q < A.length - 1) {
if (r < A.length && isTriangular(p, q, r)) {
r++;
} else {
count += (r - q - 1); // point
q++;
}
}
}
return count;
}
// abstraction
private boolean isTriangular(int p, int q, int r) {
return A[p] + A[q] > A[r] && A[q] + A[r] > A[p] && A[r] + A[p] > A[q];
}
}
import java.util.Arrays;
class Solution {
// Encapsulation
private int count = 0;
private int[] A;
public int solution(int[] A) {
this.A = A;
Arrays.sort(this.A);
for (int p = 0; p < A.length - 2; p++) {
int q = p + 1;
int r = q + 1;
while (q < A.length - 1) {
if (r < A.length && isTriangular(p, q, r)) {
r++;
} else {
count += (r - q - 1); // point
q++;
}
}
}
return count;
}
// abstraction
private boolean isTriangular(int p, int q, int r) {
return A[p] + A[q] > A[r] && A[q] + A[r] > A[p] && A[r] + A[p] > A[q];
}
}
import java.util.Arrays;
class Solution {
// Encapsulation
private int count = 0;
private int[] A;
public int solution(int[] A) {
this.A = A;
Arrays.sort(this.A);
for (int p = 0; p < A.length - 2; p++) {
int q = p + 1;
int r = q + 1;
while (q < A.length - 1) {
if (r < A.length && isTriangular(p, q, r)) {
r++;
} else {
count += (r - q - 1); // point
q++;
}
}
}
return count;
}
// abstraction
private boolean isTriangular(int p, int q, int r) {
return A[p] + A[q] > A[r] && A[q] + A[r] > A[p] && A[r] + A[p] > A[q];
}
}
import java.util.Arrays;
class Solution {
// Encapsulation
private int count = 0;
private int[] A;
public int solution(int[] A) {
this.A = A;
Arrays.sort(this.A);
for (int p = 0; p < A.length - 2; p++) {
int q = p + 1;
int r = q + 1;
while (q < A.length - 1) {
if (r < A.length && isTriangular(p, q, r)) {
r++;
} else {
count += (r - q - 1); // point
q++;
}
}
}
return count;
}
// abstraction
private boolean isTriangular(int p, int q, int r) {
return A[p] + A[q] > A[r] && A[q] + A[r] > A[p] && A[r] + A[p] > A[q];
}
}
import java.util.Arrays;
class Solution {
// Encapsulation
private int count = 0;
private int[] A;
public int solution(int[] A) {
this.A = A;
Arrays.sort(this.A);
for (int p = 0; p < A.length - 2; p++) {
int q = p + 1;
int r = q + 1;
while (q < A.length - 1) {
if (r < A.length && isTriangular(p, q, r)) {
r++;
} else {
count += (r - q - 1); // point
q++;
}
}
}
return count;
}
// abstraction
private boolean isTriangular(int p, int q, int r) {
return A[p] + A[q] > A[r] && A[q] + A[r] > A[p] && A[r] + A[p] > A[q];
}
}
The solution obtained perfect score.