Maximize A[p] · A[q] · A[r] for any triplet (p, q, r)
ℹ️ © Codility, 2009-2018
Problem
A non-empty array A consisting of n integers is given. The product of triplet (p, q, r) equates to A[p] · A[q] · A[r] (0 ≤ p < q < r < n).
For example, array A such that: A[0] = -3, A[1] = 1, A[2] = 2, A[3] = -2, A[4] = 5, A[5] = 6, contains the following example triplets:
• (0, 1, 2), product is -3 · 1 · 2 = -6;
• (1, 2, 4), product is 1 · 2 · 5 = 10;
• (2, 4, 5), product is 2 · 5 · 6 = 60.
Your goal is to find the maximal product of any triplet.
Write a function that, given a non-empty array A, returns the value of the maximal product of any triplet.
For example, given array A such that: A[0] = -3, A[1] = 1, A[2] = 2, A[3] = -2, A[4] = 5, A[5] = 6, the function should return 60, as the product of triplet (2, 4, 5) is maximal.
Assume that:
• n is an integer within the range [3 … 100,000];
• each element of array A is an integer within the range [-1,000 … 1,000].
Complexity:
• expected worst-case time complexity is O(n · log(n));
• expected worst-case space complexity is O(1), beyond input storage (not counting the storage required for input arguments).
Elements of input arrays can be modified.
Solution
C#
using System; class Solution { public int solution(int[] A) { Array.Sort(A); int n = A.Length; return Math.Max( A[0] * A[1] * A[n - 1], A[n - 3] * A[n - 2] * A[n - 1] ); } }
Java
import java.util.Arrays; import java.lang.Math; class Solution { public int solution(int[] A) { Arrays.sort(A); int n = A.length; return Math.max( A[0] * A[1] * A[n - 1], A[n - 3] * A[n - 2] * A[n - 1] ); } }
JavaScript
function solution(A) { A.sort((a, b) => a - b); let n = A.length; return Math.max( A[0] * A[1] * A[n - 1], A[n - 3] * A[n - 2] * A[n - 1] ); }
PHP
function solution($A) { sort($A); $n = count($A); return max( $A[0] * $A[1] * $A[$n - 1], $A[$n - 3] * $A[$n - 2] * $A[$n - 1] ); }