Перейти к содержимому

Самый длинный подмассив, сумма которого делится на K, с не более чем одним отрицанием II | Матема...

Manjeet Dhayal

0:00 / 0:00

Самый длинный подмассив, сумма которого делится на K, с не более чем одним отрицанием II | Матема...

1 059 просмотров · 2 нед. назад
Manjeet Dhayal
162 подписчика
1 059 просмотров · 2 нед. назад
LeetCode 4064 - Самый длинный подмассив, делящийся на K, с не более чем одним отрицанием II | Еженедельный конкурс 192 В этом видео мы решаем задачу LeetCode 4064: Самый длинный подмассив, делящийся на K, с не более чем одним отрицанием II из Еженедельного конкурса 192. Это более сложная версия предыдущей задачи. Здесь n может достигать 1e5, а k — 3000, поэтому решения со сложностью O(N²) и O(N * K) слишком медленные. Ключевое наблюдение связано с префиксными суммами и модульной арифметикой. Для подмассива (l, r]: сумма = p[r] - p[l] Если мы инвертируем nums[j], где j находится внутри подмассива, новая сумма становится: новая сумма = p[r] - p[l] - 2 * nums[j] Чтобы новая сумма делилась на k: p[r] % k = (p[l] % k + (2 * nums[j]) % k) % k Таким образом, мы можем рассуждать в терминах: остаток справа = остаток слева + остаток при изменении Для каждого остатка мы храним: первую позицию префикса, где он появляется последнюю позицию префикса, где он появляется Мы также группируем индексы по: d = (2 * nums[j]) % k Затем для каждой возможной пары: остаток слева x остаток при изменении d мы вычисляем: требуемый остаток = (x + d) % k Используя самый ранний левый префикс и Для проверки наличия в выбранном подмассиве некоторого индекса j с остатком от деления d на 1000. Если да, то этот подмассив действителен. Временная сложность: O(N + K² log N) Пространственная сложность: O(N + K) #leetcode #leetcode4064 #biweeklycontest192 #prefixsum #modulararithmetic #binarysearch #competitiveprogramming #algorithms