LeetCode 1423. 可获得的最大点数
题目描述
思路分析
解法一:滑动窗口取最小补集(推荐)
核心思路:
- 选取两端 k 张牌等价于丢弃中间连续的
n-k张牌。- 计算总和后,用滑动窗口求长度为
n-k的最小子数组和。- 最终答案为
total - minWindow。
复杂度分析:
- 时间复杂度:O(n),其中 n 表示数组长度。
- 空间复杂度:O(1),仅使用常数额外空间。
class Solution {
public int maxScore(int[] cardPoints, int k) {
int n = cardPoints.length;
int windowSize = n - k;
int total = 0;
for (int val : cardPoints) {
total += val;
}
if (windowSize == 0) {
return total;
}
int windowSum = 0;
for (int i = 0; i < windowSize; i++) {
windowSum += cardPoints[i];
}
int minSum = windowSum;
for (int i = windowSize; i < n; i++) {
windowSum += cardPoints[i] - cardPoints[i - windowSize];
minSum = Math.min(minSum, windowSum);
}
return total - minSum;
}
}
func maxScore(cardPoints []int, k int) int {
n := len(cardPoints)
windowSize := n - k
total := 0
for _, v := range cardPoints {
total += v
}
if windowSize == 0 {
return total
}
windowSum := 0
for i := 0; i < windowSize; i++ {
windowSum += cardPoints[i]
}
minSum := windowSum
for i := windowSize; i < n; i++ {
windowSum += cardPoints[i] - cardPoints[i-windowSize]
if windowSum < minSum {
minSum = windowSum
}
}
return total - minSum
}
相似题目
| 题目 | 难度 | 考察点 |
|---|---|---|
| 1658. 将 x 减到 0 的最小操作数 | 中等 | 滑动窗口 |
| 209. 长度最小的子数组 | 中等 | 滑动窗口 |
| 643. 子数组最大平均数 I | 简单 | 滑动窗口 |
| 1343. 大小为 K 且平均值大于等于阈值的子数组数目 | 中等 | 滑动窗口 |
| 1004. 最大连续1的个数 III | 中等 | 滑动窗口 |
本博客所有文章除特别声明外,均采用
CC BY-NC-SA 4.0
许可协议,转载请注明出处!