Метод получения максимального произведения из 3 состоит в том, чтобы в основном находить самые большие 3 числа из массива и самые маленькие 2 числа из массива всего за одну итерацию по массиву.Есть, конечно, большое разнообразие решений, но это оптимальное 1, потому что время решения проблемы O (n), время других решений O (n lg n)
Вот код Java: кстати, есть гарантия, что входной массив не пустой и содержит минимум 3 элемента, поэтому нет необходимости в дополнительных проверках на пустоту и т. д.
int solution(int[] a) {
/ * минимумы, инициализированные с maxint, чтобы избежать случаев с крайним максимумом в массиве и ложными минимумами 0 возвращенных минимумов * /
int min1 = Integer.MAX_VALUE;
int min2 = Integer.MAX_VALUE;
/* та же логика для максимальных инициализаций, но, конечно, инвертированная, чтобы избежать крайних минимальных значений в массиве и ложных 0 максимумов * /
int max1 = Integer.MIN_VALUE;
int max2 = Integer.MIN_VALUE;
int max3 = Integer.MIN_VALUE;
// итерация по массиву
for (int i = 0; i < a.length; i++) {
// test, если max1 меньше текущего значения массива
if (a[i] > max1) {
/ * сохранить текущее значение max1 во временной переменной, чтобы позже проверить его по второму максимуму, как вы можете видеть, представляет собой цепочку изменений, есличДля самого большого максимума мы должны изменить 2 * /
int tempMax1 = max1;
// назначить текущее значение массива как максимальное
max1=a[i];
// проверить прежнее значение max1 maxMax1 против max2
if(tempMax1>max2){
/ * сохранить значение max2 в значении tempMax2, чтобы проверить его по отношению к max3, и присвоить его максимуму 3, если оно больше * /
int tempMax2 = max2;
max2 =tempMax1;
if(tempMax2>max3){
max3 = tempMax2;
}
/ *, чтобы проверить, больше ли значение tempMax1, если оно большене больше, чем max3, это происходит, когда max1 получает новое значение, а старое значение max1 равно max2, но больше max3 * /
}else{
if(tempMax1>max3){
max3 = tempMax1;
}
}
/ * в случае, если ток a [i] не больше max1, мы тестируем его, чтобы увидеть, может быть, больше второго max.Затем та же самая логика сверху применяется здесь для max3 * /
}else if(a[i]>max2){
int tempMax2 = max2;
max2 = a[i];
if(tempMax2>max3){
max3 =tempMax2;
}
/ * наконец, если текущее значение массива не больше max1, а max2 может быть больше max3 * /
}else if(a[i]>max3){
max3 = a[i];
}
/ * Логика сверху с максимумами применяется здесь с минимумами, но, конечно, инвертирована, чтобы обнаружить 2 минимума из текущего массива.* /
if (a[i] < min1) {
int tempMin1 = min1;
min1 = a[i];
if (tempMin1 < min2) {
min2 = tempMin1;
}
} else if (a[i] < min2) {
min2 = a[i];
}
}
/ * после того, как мы обнаружили 3 наибольших максимума и 2 наименьших минимума из массива, мы делаем 2 произведения из 3 от наибольшего максимума и 2 минимумов.Это необходимо, потому что математически произведение двух отрицательных значений является положительным значением, и из-за этого произведение min1 * min2 * max1 может быть больше, чем max1 * max2 * max3 и произведение, построенное из 3 максимумов.* /
int prod1 = min1 * min2 * max1;
int prod2 = max1 * max2 * max3;
// здесь мы просто вернем самый большой продукт
return prod1 > prod2 ? prod1 : prod2;
}