题目
几张卡牌 排成一行,每张卡牌都有一个对应的点数。点数由整数数组 cardPoints 给出。
每次行动,你可以从行的开头或者末尾拿一张卡牌,最终你必须正好拿 k 张卡牌。
你的点数就是你拿到手中的所有卡牌的点数之和。
给你一个整数数组 cardPoints 和整数 k,请你返回可以获得的最大点数。
分析
- 合的最大值=> max=>反向就是min
- 可以从头尾取 => 那么反过来想 拿完剩下的就是 固定的滑动窗口
解法:滑动窗口
/*
* @lc app=leetcode.cn id=1423 lang=javascript
*
* [1423] 可获得的最大点数
*/
/*
思想
1. 既然只能从头尾取 那么我们可以反向理解成固定的滑动窗口, 只要滑动窗口的值越小那么拿到的牌的总数就越大
2. 首先获取总的值 sum
3. 然后再取 滑动窗口的min
4. 最后 sum -min 就是最大值
*/
// @lc code=start
/**
* @param {number[]} cardPoints
* @param {number} k
* @return {number}
*/
var maxScore = function (cardPoints, k) {
// 初始化 min 和左指针j
let min = Infinity;
let j = 0;
let sum = 0;
// 滑动窗口的值
let window = 0;
// 求总的值
for (let i = 0; i < cardPoints.length; i++) {
sum += cardPoints[i];
}
// 求初始化的时候滑动窗口的值 当 j=0 ,i =cardPoints.length - k-1
for (let i = 0; i < cardPoints.length - k; i++) {
window += cardPoints[i];
}
min = Math.min(window, min);
// 不断移动滑动窗口
for (let i = cardPoints.length - k; i < cardPoints.length; i++) {
window += cardPoints[i];
window -= cardPoints[j];
j++;
min = Math.min(window, min);
}
return sum - min;
};
//时间复杂度:O(n)
//空间复杂度:O(1)
// @lc code=end
总结
今天这道题是主要是练习如何使用 固定尺寸的滑动窗口 来求最大的值的题目
大家可以看看我分享的一个专栏(前端搞算法)里面有更多关于算法的题目的分享,希望能够帮到大家,我会尽量保持每天晚上更新,如果喜欢的麻烦帮我点个赞,十分感谢
大家如果对“TS”感兴趣的可以看看我的专栏 (TypeScript常用知识),感谢大家的支持
文章内容目的在于学习讨论与分享学习算法过程中的心得体会,文中部分素材来源网络,如有侵权,请联系删除,邮箱 182450609@qq.com
\