Дан массив из n различных элементов. Найти максимальное произведение минимума двух чисел в массиве и абсолютную разницу их позиций, т. Е. Найти максимальное значение abs (i — j) * min (arr [i], arr [j]), где i и j меняются от 0 до n-1.
Примеры :
Input : arr[] = {3, 2, 1, 4} Output: 9 // arr[0] = 3 and arr[3] = 4 minimum of them is 3 and // absolute difference between their position is // abs(0-3) = 3. So product is 3*3 = 9 Input : arr[] = {8, 1, 9, 4} Output: 16 // arr[0] = 8 and arr[2] = 9 minimum of them is 8 and // absolute difference between their position is // abs(0-2) = 2. So product is 8*2 = 16
Простое решение этой проблемы — взять каждый элемент один за другим и сравнить этот элемент с элементами справа от него. Затем рассчитайте произведение минимума из них и абсолютной разницы между их показателями и максимизируйте результат. Временная сложность для этого подхода O (n ^ 2).
Эффективное решение для решения задачи в линейной сложности времени. Мы берем два итератора Left = 0 и Right = n-1 , сравниваем элементы arr [Left] и arr [right].
left = 0, right = n-1 maxProduct = -INF While (left < right) If arr[Left] < arr[right] currProduct = arr[Left]*(right-Left) Left++ . If arr[right] < arr[Left] currProduct = arr[Right]*(Right-Left) Right-- . maxProduct = max(maxProduct, currProduct)
Ниже приведена реализация вышеуказанной идеи.
|
Джава
|
python3
|
C #
|
PHP
|
Выход :
16
Как это работает?
Важно показать, что мы не пропускаем ни одной потенциальной пары в вышеупомянутом линейном алгоритме, т.е. нам нужно показать, что выполнение left ++ или right — не приводит к случаю, когда мы получили бы более высокое значение maxProduct.
Обратите внимание, что мы всегда умножаем на (справа — слева).
1) Если arr [left] <arr [right], то меньшие значения right для текущего left бесполезны, так как не могут дать более высокое значение maxProduct (потому что мы умножаемся на arr [left] с (right — left)). Что делать, если arr [left] больше, чем любой из элементов на левой стороне. В этом случае лучшая пара для этого элемента должна быть найдена с текущим правом. Поэтому мы можем безопасно увеличить левое, не пропуская лучшую пару с текущим левым.
2) Аналогичные аргументы применимы, когда arr [right] <arr [left].
Эта статья предоставлена Шашанком Мишрой (Гуллу) . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.
Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.
Рекомендуемые посты:
- Для данного массива arr [] найдите максимум j — i такой, что arr [j]> arr [i]
- Найти максимальный элемент в массиве, кроме A i
- Найти максимальную сумму триплетов в массиве, такую как i <j <k и a [i] <a [j] <a [k]
- Найти максимальное xor k элементов в массиве
- Найти триплеты в массиве с максимальным AND
- Найти максимальное значение XOR подмассива размера k
- Найти максимальную сумму фигуры Плюс в двумерном массиве
- Найдите простое число K в массиве так, чтобы (A [i]% K) было максимально
- Найти максимальную сумму, берущую каждый элемент K в массиве
- Найти сумму максимально возможной разности из всех подмножеств данного массива.
- Найдите пару (n, r) в целочисленном массиве, чтобы значение nPr было максимальным
- Найти пару (n, r) в целочисленном массиве, чтобы значение nCr было максимальным
- Найти максимальное количество элементов в первой и второй половинках массива
- Найти элемент с максимальными установленными битами в массиве
- Найти максимальную сумму массива длиной, меньшей или равной m
0.00 (0%) 0 votes