Сумма ширин подпоследовательностей
Источник: https://leetcode.com/problems/sum-of-subsequence-widths/
Дан массив целых чисел nums.
Для каждой непустой подпоследовательности seq, назовем шириной разницу между минимальным и максимальным элементами подпоследовательности seq.
Вернуть сумму ширин всех подпоследовательностей массива nums.
Поскольку ответ может быть очень большим, вернуть ответ по по модулю 109 + 7.
Пример 1:
Дано: nums = [2,1,3] Результат: 6 Пояснение: Подпоследовательности массива: [1], [2], [3], [2,1], [2,3], [1,3], [2,1,3]. Их соответствующие ширины: 0, 0, 0, 1, 1, 2, 2. Сумма ширин = 6.
Примечания:
1 <= nums.length <= 200001 <= nums[i] <= 20000
Идея решения
Исходная последовательность чисел не имеет значения, поэтому без ограничения общности мы можем отсортировать массив.
Для каждого элемента отсортированного массиваA[i]:
Существуют
iэлементов которые меньше его,
поэтому существуют2 ^ iподпоследовательносетй,в которыхA[i]- это максимум. Поэтому мы прибавим к результату:res += A[i] * 2^iСуществуют также
n - i - 1элементов, которые больше его,
поэтому имеем2 ^ (n - i - 1)подпоследовательностей, в которых in whichA[i]- это минимум.
Поэтому вычтем:res -= A[i] * 2^(n - i - 1)
В переменной resу нас находится ответ.
Сложность:
Время O(NlogN)
Память O(1)
Теория: свойства операции сравнения по модулю
Имплементация
public int sumSubseqWidths(int[] A) {
Arrays.sort(A); // сортируем за O(N logN)
long c = 1, res = 0, mod = (long)1e9 + 7; // константы
// внимание, модуль можно оформить также вот так: int mod = 1_000_000_007;
// проходим по каждому элементу отсортированного массива
for (int i = 0, n = A.length; i < n; ++i, c = c * 2 % mod)
// добавляем количество подпоследовательностей с элементами меньше A[i]
// вычитаем количество подпоследовательностей с элементами больше A[i]
// и каждый раз умножаем на 2, чтобы получить 2 в степени
res = (res + A[i] * c - A[n - i - 1] * c) % mod;
return (int)((res + mod) % mod);
} Вопрос. Почему мы прибавляем mod перед возвращением результата?Ответ Перед этой операцией результат может быть отрицательным. Модуль на отрицательном числе - это отрицательное число. А нам нужно получить положительное. Поэтому мы прибавляем модуль. Тогда x+mod становится подложительным.
Комментарии
Отправить комментарий