1423. 可获得的最大点数
maxScore

一、解题思路
1、解法一( Java )
解法思路:滑动窗口(选定不需要的卡牌作为窗口)
由于剩余卡牌是连续的,使用一个固定长度为 n−k 的滑动窗口对数组 cardPoints 进行遍历,求出滑动窗口最小值,然后用所有卡牌的点数之和减去该最小值,即得到了拿走卡牌点数之和的最大值。
stream(int[] array)
返回顺序 IntStream 与指定的数组作为源。
Interface IntStream 接口下的 sum() 方法
返回此流中元素的总和。
伪代码如下:
/**
* @author Listen 1024
* @description 1423. 可获得的最大点数 maxScore
* @date 2022-03-30 9:14
*/
class Solution {
public int maxScore(int[] cardPoints, int k) {
//sliding window
//select unwanted cards as the window
//left pointer & right pointer
int res = 0, sum = 0;
int len = cardPoints.length;
int windowSize = len - k;
for (int i = 0; i < windowSize; ++i) {
sum += cardPoints[i];
}
res = sum;
for (int right = windowSize; right < len; ++right) {
sum += cardPoints[right] - cardPoints[right - windowSize];
res = Math.min(res, sum);
}
return Arrays.stream(cardPoints).sum() - res;
}
}
2、解法二( Java )
解法思路:滑动窗口
滑动窗口选取指定需要的卡牌
/**
* @author Listen 1024
* @description 1423. 可获得的最大点数 maxScore
* @date 2022-03-30 9:14
*/
class Solution{
public int maxScore(int[] cardPoints, int k) {
//sliding window
//select wanted cards as the window
//left pointer & right pointer
int res = 0, sum = 0;
int len = cardPoints.length;
for (int i = 0; i < k; ++i) {
sum += cardPoints[i];
}
res = sum;
for (int i = 0; i < k; ++i) {
sum += cardPoints[len - 1 - i];
sum -= cardPoints[k - 1 - i];
res = Math.max(res, sum);
}
return res;
}
}
运行结果截图如下:


本文介绍了解决1423.可获得的最大点数问题的两种滑动窗口方法,通过选择不同长度的窗口来获取卡牌点数之和的最大值。提供了详细的Java实现代码。
2893

被折叠的 条评论
为什么被折叠?



