跨境电商平台网站建设广州,wordpress 主题数据包,wordpress防盗链,房地产网络营销论文【题目描述】 几张卡牌 排成一行#xff0c;每张卡牌都有一个对应的点数。点数由整数数组 cardPoints 给出。
每次行动#xff0c;你可以从行的开头或者末尾拿一张卡牌#xff0c;最终你必须正好拿 k 张卡牌。
你的点数就是你拿到手中的所有卡牌的点数之和。
给你一个整数…【题目描述】 几张卡牌 排成一行每张卡牌都有一个对应的点数。点数由整数数组 cardPoints 给出。
每次行动你可以从行的开头或者末尾拿一张卡牌最终你必须正好拿 k 张卡牌。
你的点数就是你拿到手中的所有卡牌的点数之和。
给你一个整数数组 cardPoints 和整数 k请你返回可以获得的最大点数。
【示例】
示例 1
输入cardPoints [1,2,3,4,5,6,1], k 3
输出12
解释第一次行动不管拿哪张牌你的点数总是 1 。但是先拿最右边的卡牌将会最大化你的可获得点数。最优策略是拿右边的三张牌最终点数为 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^51 cardPoints[i] 10^41 k cardPoints.length 思路
只能从左或者右依次拿牌那么可以用滑动窗口直接从最右边开始取K张牌然后依次从左边开始拿一张牌并去掉一张右边的牌 例如样例1cardPoints [1,2,3,4,5,6,1], k 3
先拿561三张牌然后丢掉5从左边拿一张1以此类推 代码
class Solution {public int maxScore(int[] cardPoints, int k) {int maxx 0;int len cardPoints.length;int x len - k;int tmp 0;//计算右边k个元素的总和for (int j 0; j k; j) {int index (x j) % len;tmp cardPoints[index];}maxx tmp;for (int i x 1; i len; i) {tmp tmp - cardPoints[(i - 1) % len] cardPoints[(i k - 1) % len];if (tmp maxx) {maxx tmp;}}return maxx;}
}