이야기:
1423 년 、 사용 가능한 최대 포인트
여러 카드가 한 줄로 배열되어 있으며 각 카드에는 해당 포인트가 있습니다. 포인트 수는 정수 배열 cardPoints에 의해 제공됩니다.
각 행동에 대해 라인의 시작 또는 끝에서 카드를 가져올 수 있으며, 마지막에는 정확히 k 장의 카드를 가져와야합니다.
당신의 포인트는 당신의 손에있는 모든 카드의 포인트의 합계입니다.
정수 배열 cardPoints와 정수 k를 주면 얻을 수있는 최대 포인트 수를 반환하십시오.
예 1 :
입력 : cardPoints = [1,2,3,4,5,6,1], k = 3
출력 : 12
설명 : 첫 번째 행동에서 어떤 카드를 사용하든 점수는 항상 1입니다. 그러나 가장 오른쪽에있는 카드를 먼저 가져 가면 사용 가능한 포인트가 최대화됩니다. 최적의 전략은 오른쪽에있는 3 장의 카드를 가져가는 것이며, 마지막 포인트는 1 + 6 + 5 = 12입니다.
예 2 :
입력 : cardPoints = [2,2,2], k = 2
출력 : 4
설명 : 어떤 두 장의 카드를 줍든지 상관없이 얻을 수있는 점수는 항상 4입니다.
예 3 :
입력 : cardPoints = [9,7,7,9,7,7,9], k = 7
출력 : 55
설명 : 모든 카드를 집어 야하며 얻을 수있는 점수는 모든 점수의 합입니다. 카드.
예 4 :
입력 : cardPoints = [1,1000,1], k = 1
출력 : 1
설명 : 중간에 카드를 넣을 수 없으므로 얻을 수있는 최대 점수는 1입니다.
예 5 :
입력 : cardPoints = [1,79,80,1,1,1,200,1], k = 3
출력 : 202
신속한:
1 <= cardPoints.length <= 10 ^ 5
1 <= cardPoints [i] <= 10 ^ 4
1 <= k <= cardPoints.length
문제 해결 아이디어 :
아이디어
배열 cardPoints의 길이는 n이라는 것을 기억하십시오. 처음과 끝에서 k 개의 카드 만 가져올 수 있으므로 마지막 남은 카드는 연속적인 nk 카드 여야합니다.
남은 카드 포인트 합계의 최소값을 찾아서 카드 포인트 합계의 최대 값을 찾을 수 있습니다.
연산
나머지 카드는 연속적이기 때문에 고정 길이 nk의 슬라이딩 윈도우를 사용하여 배열 cardPoints를 가로 질러 슬라이딩 윈도우의 최소값을 찾은 다음 모든 카드의 포인트 합계에서 최소값을 빼서 얻을 수 있습니다. 테이크 아웃 카드 포인트 합계의 최대 가치.
문제 해결 파이썬 코드 :
class Solution:
def maxScore(self, cardPoints: List[int], k: int) -> int:
n = len(cardPoints)
# 滑动窗口大小为 n-k
windowSize = n - k
# 选前 n-k 个作为初始值
s = sum(cardPoints[:windowSize])
minSum = s
for i in range(windowSize, n):
# 滑动窗口每向右移动一格,增加从右侧进入窗口的元素值,并减少从左侧离开窗口的元素值
s += cardPoints[i] - cardPoints[i - windowSize]
minSum = min(minSum, s)
return sum(cardPoints) - minSum
저자 : LeetCode-Solution
링크 : https://leetcode-cn.com/problems/maximum-points-you-can-obtain-from-cards/solution/ke-huo-de-de-zui-da-dian-shu -by-leetcode-7je9 /
출처 : LeetCode https://leetcode-cn.com/problems/maximum-points-you-can-obtain-from-cards/