This is my solution for the MaxProductOfThree from codility, it scores 100%, but I'm not a fan of the if if if
structure it has going on.
Task description
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 is1 * 2 * 5 = 10
(2, 4, 5)
, product is2 * 5 * 6 = 60
Your goal is to find the maximal product of any triplet.Write a function:
class Solution { public int solution(int[] A); }
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.Write an efficient algorithm for the following assumptions:
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].
using System;
using System.Collections.Generic;
using System.Linq;
class Solution {
public int solution(int[] A)
{
List<int> B = A.ToList();
int product = 1;
int min1 = B.Min();
if (A.Length > 3)
{
if (min1 < 0)
{
B.RemoveAt(B.IndexOf(min1));
int min2 = B.Min();
if (min2 < 0)
{
int max1 = B.Max();
if (A.Length == 4)
{
product = min1 * min2 * max1;
}
else
{
product = Math.Max(min1 * min2 * max1, getProductOfMaximalsForMoreThanTwoElements(B));
}
}
else
{
product = getProductOfMaximalsForMoreThanTwoElements(B);
}
}
else
{
product = getProductOfMaximalsForMoreThanTwoElements(B);
}
}
else
{
foreach (int element in B)
{
product *= element;
}
}
return product;
}
private int getProductOfMaximalsForMoreThanTwoElements( List<int> B)
{
int max1 = B.Max();
B.RemoveAt(B.IndexOf(max1));
int max2 = B.Max();
B.RemoveAt(B.IndexOf(max2));
int max3 = B.Max();
return max1 * max2 * max3;
}
}
To be honest, the original idea was thought beforehand, but it took me a couple of tries until every test was passed, as with most of these exercises. Are there things to improve in terms of readability, logic and quality of this code?