# LeetCode算法学习之- 滑动窗口-[1423. 可获得的最大点数]

86 阅读1分钟

题目

几张卡牌 排成一行,每张卡牌都有一个对应的点数。点数由整数数组 cardPoints 给出。

每次行动,你可以从行的开头或者末尾拿一张卡牌,最终你必须正好拿 k 张卡牌。

你的点数就是你拿到手中的所有卡牌的点数之和。

给你一个整数数组 cardPoints 和整数 k,请你返回可以获得的最大点数。

分析

  1. 合的最大值=> max=>反向就是min
  2. 可以从头尾取 => 那么反过来想 拿完剩下的就是 固定的滑动窗口

解法:滑动窗口

/*
 * @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

\