Найти максимальное произведение из 3 чисел в массиве
Дан массив целых чисел, который может содержать как + ve, так и -ve числа. Я должен максимизировать произведение любых 3 элементов массива. Элементы могут быть несмежными.
Некоторые примеры:
int[] arr = {-5, -7, 4, 2, 1, 9}; // Max Product of 3 numbers = -5 * -7 * 9
int[] arr2 = {4, 5, -19, 3}; // Max Product of 3 numbers = 4 * 5 * 3
Я пытался решить это с помощьюДинамическое программирование, но я не получаю ожидаемого результата. Он возвращает результат, часто включающий одно и то же число дважды в умножении. Итак, для массива -{4, 2, 1, 9}
Возвращается -32
, который4 * 4 * 2
.
Вот мой код:
public static int maxProduct(int[] arr, int count) {
return maxProduct(arr, 0, arr.length - 1, count);
}
private static int maxProduct(int[] arr, int fromIndex, int toIndex, int count) {
if (count == 1) {
return maximum(arr, fromIndex, toIndex);
} else if (toIndex - fromIndex + 1 < count) {
return 1;
} else {
return MathUtil.max(maxProduct(arr, fromIndex, toIndex - 1, count - 1) * arr[toIndex - 1],
maxProduct(arr, fromIndex, toIndex - 1, count));
}
}
MathUtil.max(int a, int b)
это метод, который дает максимумa
а такжеb
.Два значения, которые я передаюmax
Метод есть:maxProduct
, когда мы рассматриваем последний элемент как часть продукта.maxProduct
когда мы не рассматриваем это как часть продукта.count
содержит номер элемента, который мы хотим рассмотреть. Вот3
.Заcount == 1
, мы должны найти максимум 1 элемент из массива. Это означает, что мы должны использовать максимальный элемент массива.ЕслиtoIndex - fromIndex + 1 < count
означает, что в массиве недостаточно элементов между этими индексами.У меня есть интуиция, что первыйif
состояние является одной из причин отказа. Потому что он рассматривает только максимальный элемент из массива, в то время как максимальный продукт также может содержать отрицательные числа. Но я не знаю, как позаботиться об этом.
Причина, по которой я использую динамическое программирование, заключается в том, что я могу обобщить это решение для работы с любым значениемcount
, Конечно, если у кого-то есть лучший подход, даже дляcount = 3
Я приветствую предложение (я хотел бы избежать сортировки массива, так как это будет другойO(nlogn)
как минимум).