Это является частью серии объяснений решения LeetCode ( index ). Если вам понравилось это решение или нашли его полезным, Пожалуйста, нравится Этот пост и/или upvote Мое решение по сообщению на форумах LeetCode Анкет
Проблема LeetCode #1423 (Medium): максимальные точки, которые вы можете получить из карт
Описание:
( прыгнуть в : Идея решения Код : JavaScript | Python | Java | C ++
Есть несколько карт Аранжируется подряд , и каждая карта имеет связанное количество точек, которые пункты приведены в целочисленном массиве CardPoints
Анкет
На одном шаге вы можете взять одну карту с самого начала или с конца ряда. Вы должны взять точно k
открытки.
Ваш счет – это сумма точек карт, которые вы взяли.
Учитывая целочисленное массив CardPoints
и целое число k
, вернуть максимальная оценка Вы можете получить.
Примеры:
Вход: | Cardpoints = [1,2,3,4,5,6,1], |
Выход: | 12 |
Объяснение: | После первого шага ваш счет всегда будет 1. Тем не менее, выбор самой правой карты сначала максимизирует ваш общий балл. Оптимальная стратегия состоит в том, чтобы взять три карты справа, давая окончательный счет 1 + 6 +. |
Вход: | CardPoints = [ 2,2,2], |
Выход: | 4 |
Объяснение: | Независимо от того, какую две карты вы принимаете, ваш счет всегда будет 4. |
Вход: | CardPoints = [9,7,7,9,7,7,9], |
Выход: | 55 |
Объяснение: | Вы должны взять все карты. Ваш счет – сумма очков всех карт. |
Вход: | CardPoints = [1,1000,1], |
Выход: | 1 |
Объяснение: | Вы не можете взять карту посередине. Ваш лучший результат – 1. |
Вход: | CardPoints = [ 1,79,80,1,1,1,200,1], |
Выход: | 202 |
Ограничения:
1.length^5
1 [i]^4
1. длиной
Идея:
( Прыгните к : Описание задачи Код : JavaScript | Python | Java | C ++
Поскольку мы вынуждены принимать K Количество карт, несмотря ни на что, мы можем решить эту проблему с Двухметочная система с скользящее окно подход. Вместо подсчета суммы значений Между Два указателя, мы вместо этого подсчитым сумму значений снаружи скользящее окно.
Мы можем начать с итерации через первое K Карты нашего списка карт ( C ) и поиск Всего точки. На этом этапе наше обратное окно будет картами из я к J.Length – 1 Анкет На каждой итерации мы сдвинем окно назад, снимая одну карту с левой стороны ( -c [i] ) и добавив одну карту с правой стороны ( +c [j] ) каждый время.
Мы должны отслеживать Лучший Возможный результат на каждой итерации, затем вернуть лучший Как только мы достигнем конца.
- Сложность времени: O (k)
- Сложность пространства: O (1)
Код JavaScript:
( Прыгните к : Описание задачи Идея решения
var maxScore = function(C, K) { let total = 0 for (let i = 0; i < K; i++) total += C[i] let best = total for (let i = K - 1, j = C.length - 1; ~i; i--, j--) total += C[j] - C[i], best = Math.max(best, total) return best };
Код Python:
( Прыгните к : Описание задачи Идея решения
class Solution: def maxScore(self, C: List[int], K: int) -> int: best = total = sum(C[:K]) for i in range (K-1, -1, -1): total += C[i + len(C) - K] - C[i] best = max(best, total) return best
Код Java:
( Прыгните к : Описание задачи Идея решения
class Solution { public int maxScore(int[] C, int K) { int total = 0; for (int i = 0; i < K; i++) total += C[i]; int best = total; for (int i = K - 1, j = C.length - 1; i >= 0; i--, j--) { total += C[j] - C[i]; best = Math.max(best, total); } return best; } }
C ++ Код:
( Прыгните к : Описание задачи Идея решения
class Solution { public: int maxScore(vector& C, int K) { int total = 0; for (int i = 0; i < K; i++) total += C[i]; int best = total; for (int i = K - 1, j = C.size() - 1; ~i; i--, j--) total += C[j] - C[i], best = max(best, total); return best; } };
Оригинал: “https://dev.to/seanpgallivan/solution-maximum-points-you-can-obtain-from-cards-2no”