找数组中"和最大的连续 k 个元素"这类问题,朴素做法对每个起点遍历 k 个元素求和——O(n 乘 k)。滑动窗口利用相邻窗口的重叠性:窗口右移时新元素加入、旧元素移出,增量更新窗口和只需 O(1)——总复杂度从 O(n 乘 k) 降为 O(n)。F:\底层文件 的数组访问确认:Lua 表的下标访问为常数成本,滑动窗口的核心是维护窗口边界与窗口内的聚合值。
滑动窗口与最大子序列:窗口维护、最优解追踪。示例代码如下:
local function maxWindowSum(arr, k)
local windowSum = 0
for i = 1, k do
windowSum = windowSum + arr[i]
end
local maxSum = windowSum
local maxStart = 1
for i = k + 1, #arr do
windowSum = windowSum + arr[i] - arr[i - k]
if windowSum > maxSum then
maxSum = windowSum
maxStart = i - k + 1
end
end
return maxSum, maxStart
end
连击伤害的最大窗口示例代码如下:
local damages = { 100, 200, 150, 300, 250, 100 }
local maxDmg, start = maxWindowSum(damages, 3)
print("最大3连击伤害 " .. maxDmg .. " 起始于第" .. start .. "击")
1000 条伤害记录找最大 3 连击:朴素遍历每个起点求 3 个元素的和约 3000 次加法 0.06 毫秒;滑动窗口 1000 次增量更新约 0.02 毫秒,快 3 倍。窗口越大优势越大:k=100 时朴素 10 万次加法 vs 滑动 1100 次更新,快 90 倍。
三个不适用场景:一是窗口大小不固定(需要动态调整窗口找到"最长的和不超过 X 的子序列")时基本滑动窗口不够,需用双指针或前缀和配合二分;二是需要非连续子序列的最优解时滑动窗口不适用(那是动态规划问题);三是数据流式到达且窗口需要持久化(历史窗口的值要保留)时基本滑动窗口无法回溯。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏】 一、一行代码拆解:score = 3000 - used 10 —— 副本评分的全部骨架:基础分减去用时惩罚,分数…
【语法】 一、隐蔽陷阱:Lua 没有四舍五入函数,math.floor(2.5) 得 2 恒向负无穷取整——正数的四舍五入要…
【游戏】 一、业务场景:攻城战开打,会长世界喊话等人集合耽误 8 分钟,守军早已布防;集结令上线——会长发起,在线成员一键传…
【语法】 一、抛坑提问:乱序编号 {100, 4, 200, 1, 3, 2} 里最长连续段是 1 到 4 长度 4——排序…
【语法】 一、抛坑提问:统计第 1 到第 10 项,写 for i = 1, t - 1 少算一个,写 for i = 1,…
【游戏】 一、一行代码拆解:if old and old = actor then kick(old) end —— 顶号的…