MaxProductOfThree

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]
  );
}