LeetCode上可获得的最大点数,也是用滑动窗口,记录下解题思路。
这道题可以视为窗口在首尾之间的移动,可以将数组看为一个环形更加容易理解,记录最大窗口的值,
假设传入cardPoints = [1,2,3,4,5,6,1], k = 3
,一开始的时候,取star = 0/end =k,是直接圈出了在数组起始位取k个数的结果
窗口: [1 2 3] 4 5 6 1,此时窗口内的和为6,记录为max = 6/current = 6
然后窗口向右移动
窗口: [1 2 ]3 4 5 6 [1],此时窗口内的数是[1 2 1],记录为max = 6/current = 4
窗口继续移动
窗口: [1] 2 3 4 5 [6 1],此时窗口内的数是[1 6 1],记录为max = 8/current = 8
窗口继续移动
窗口: 1 2 3 4 [5 6 1],此时窗口内的数是[1 5 6],记录为max = 12/current = 12
这次移动之后窗口变为从数组尾部向前取k个数,那么循环就要结束,返回最大值max即为结果
var maxScore = function (cardPoints, k) {
// 是在传入数组首尾取k个数组求和
// 就相当于把窗口放在首尾移动
// 定义起始位置
let star = 0
let end = k
// 定义获取的最大值
let max = 0
// 定义当前窗口内的值
let current = 0
// 求初始的值
let arr = cardPoints.slice(0,k)
current = arr.reduce((a,b) => {return a+b},0)
max = current
// 窗口开始移动
// 从开始向末尾移动,可以移动k次,直到整个窗口都在末尾
for(let i =1;i<=k;i++) {
// 每次移动过后的窗口内容是,减去开始处第[k-i]个数,加上结尾处[数组长 - i]个数
current = current - cardPoints[k-i] + cardPoints[cardPoints.length - i]
// 比较移动前后的最大值
max = Math.max(max,current)
}
return max
};