Эта статья участвует в "Месяце тем Python", подробнее см.Ссылка на мероприятие
Описание темы
Это на LeetCode1818. Сумма абсолютной разницы, сложность в томсредний.
Метка: "две точки"
Вам даны два массива положительных целых чисел nums1 и nums2, оба имеют длину n.
Сумма абсолютных разностей массивов nums1 и nums2 определяется как сумма всех |nums1[i] - nums2[i]| (0
Вы можете заменить не более одного элемента в nums1 любым элементом в nums1, чтобы минимизировать сумму абсолютных разностей.
Возвращает наименьшую сумму абсолютных разностей после замены не более одного элемента в массиве nums1. Поскольку ответ может быть большим, он должен быть правильнымВернитесь, взяв остаток.
|x| определяется как:
- Значение равно x, если x >= 0, или
- Если x
Пример 1:
输入:nums1 = [1,7,5], nums2 = [2,3,5]
输出:3
解释:有两种可能的最优方案:
- 将第二个元素替换为第一个元素:[1,7,5] => [1,1,5] ,或者
- 将第二个元素替换为第三个元素:[1,7,5] => [1,5,5]
两种方案的绝对差值和都是 |1-2| + (|1-3| 或者 |5-3|) + |5-5| = 3
Пример 2:
输入:nums1 = [2,4,6,8,10], nums2 = [2,4,6,8,10]
输出:0
解释:nums1 和 nums2 相等,所以不用替换元素。绝对差值和为 0
Пример 3:
输入:nums1 = [1,10,4,4,2,7], nums2 = [9,3,5,1,7,4]
输出:20
解释:将第一个元素替换为第二个元素:[1,10,4,4,2,7] => [10,10,4,4,2,7]
绝对差值和为 |10-9| + |10-3| + |4-5| + |4-1| + |2-7| + |7-4| = 20
намекать:
- n == nums1.length
- n == nums2.length
- 1 <= n <=
- 1 <= nums1[i], nums2[i] <=
две точки
Это дихотомический вопрос, конкретный метод заключается в следующем:
Перед обработкой мы сначалаСкопируйте и отсортируйте, чтобы получитьмножество.
потомпересекаяиВычислить общую разницу, в пареВыполните бинарный поиск, чтобы найти наиболее подходящую заменузначение.
В частности, когда мы имеем дело сбит, предполагается, что исходная разность бита равна, то изНайти ближайший в массиве по двоичному кодузначение, вычислить новую разницу(Обратите внимание, чтобы проверить точку разделения и следующий бит точки разделения), если он удовлетворенЧтобы показать, что есть альтернатива уменьшить разницу, мы используем переменнуюОбратите внимание на изменения, внесенные этой альтернативой, и обновляйте ее..
При обработке всего массиваИзменение разности, соответствующее оптимальному решению, сохраняется, в это времяэто ответ.
Java-код:
class Solution {
int mod = (int)1e9+7;
public int minAbsoluteSumDiff(int[] nums1, int[] nums2) {
int n = nums1.length;
int[] sorted = nums1.clone();
Arrays.sort(sorted);
long sum = 0, max = 0;
for (int i = 0; i < n; i++) {
int a = nums1[i], b = nums2[i];
if (a == b) continue;
int x = Math.abs(a - b);
sum += x;
int l = 0, r = n - 1;
while (l < r) {
int mid = l + r + 1 >> 1;
if (sorted[mid] <= b) l = mid;
else r = mid - 1;
}
int nd = Math.abs(sorted[r] - b);
if (r + 1 < n) nd = Math.min(nd, Math.abs(sorted[r + 1] - b));
if (nd < x) max = Math.max(max, x - nd);
}
return (int)((sum - max) % mod);
}
}
Код Python 3:
class Solution:
mod = 10 ** 9 + 7
def minAbsoluteSumDiff(self, nums1: List[int], nums2: List[int]) -> int:
n = len(nums1)
sortedNums1 = sorted(nums1)
totalSum = maxDiff = 0
for i in range(n):
a, b = nums1[i], nums2[i]
if a == b:
continue
x = abs(a - b)
totalSum += x
l, r = 0, n - 1
while l < r:
mid = l + r + 1 >> 1
if sortedNums1[mid] <= b:
l = mid
else:
r = mid - 1
nd = abs(sortedNums1[r] - b)
if r < n - 1:
nd = min(nd, abs(sortedNums1[r + 1] - b))
if nd < x:
maxDiff = max(maxDiff, x - nd)
return (totalSum - maxDiff) % self.mod
- Временная сложность: да
sorted
Сложность копирования и сортировки; При обходе массива обработки он попытается разделить статистику, пытаясь найти наиболее подходящее значение замены.. Общая сложность составляет - Пространственная сложность: использовать
sorted
потребности массиваПространственная сложность , в то время как процесс сортировки будет использоватьПространственная сложность ; общая сложность
Наконец
Это первая статья из нашей серии «Пройдитесь по LeetCode».No.1818
Серия стартует 01.01.2021.На момент старта на LeetCode 1916 вопросов, некоторые из которых заблокированы.Сначала закончим все вопросы без замков.
В этой серии статей, помимо объяснения идей решения проблем, будет дан максимально лаконичный код. Если речь идет об общих решениях, также будут предоставлены соответствующие шаблоны кода.
Чтобы облегчить студентам отладку и отправку кода на компьютере, я создал соответствующие склады:GitHub.com/sharing кислый….
В адресе склада вы можете увидеть ссылку на решение серии статей, соответствующий код серии статей, ссылку на исходный вопрос LeetCode и другие предпочтительные решения.