几张卡牌 排成一行,每张卡牌都有一个对应的点数。点数由整数数组 cardPoints
给出。
每次行动,你可以从行的开头或者末尾拿一张卡牌,最终你必须正好拿 k
张卡牌。
你的点数就是你拿到手中的所有卡牌的点数之和。
给你一个整数数组 cardPoints
和整数 k
,请你返回可以获得的最大点数。
1 <= cardPoints.length <= 10^5
1 <= cardPoints[i] <= 10^4
1 <= k <= cardPoints.length
假设前面拿i张,后面则拿k-i张。
如果正常写需要写两个for循环,分别求前面的点数和、后面的点数和。超时。
所以可用用前缀和和后缀和来预处理。
pre[i]表示第1~第i个数的和。
post[i]表示第i~第n个数的和。
所以 结果 = max pre[i] + post[ n-(k-i-1)]