【语法】
一、抛坑提问:长度 n 的数组取每个 k 窗口的最大值,逐窗扫描是 n 乘 k;单调队列保证每个元素只进出各一次,整体线性。
二、底层原理:队列存下标且对应值单调递减:新元素入队前把队尾比它小的全部淘汰(它们不可能再成为最大),队首超出窗口范围则弹出,队首即当前窗口最大。
三、正确代码:
错误写法。示例代码如下:
local function winMax(t, k)
local out = {}
for i = 1, #t - k + 1 do
local m = t[i]
for j = i, i + k - 1 do -- 每窗重扫,n乘k
m = math.max(m, t[j])
end
out[#out + 1] = m
end
return out
end
正确写法。示例代码如下:
local function winMax(t, k)
local q, out = {}, {}
for i = 1, #t do
while #q > 0 and t[q[#q]] <= t[i] do
table.remove(q) -- 队尾淘汰不可能的最大值
end
q[#q + 1] = i
if q[1] <= i - k then table.remove(q, 1) end -- 出窗弹头
if i >= k then out[#out + 1] = t[q[1]] end
end
return out
end
sendmsg(actor, 1, "窗口最大值 " .. #winMax(
{4, 3, 5, 4, 3, 3, 6, 7}, 3))
四、引擎验证:1 万数据取 100 窗口:重扫版 100 万次比较;单调队列版约 2 万次进出,快 50 倍,结果逐窗一致。
五、FAQ:问:队列存值还是下标?答:存下标,才能判断队首是否滑出窗口范围。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏】 一、规则机制 一行定骨架:mask:setVisible(true) 先于一切加载动作。切图最怕"加载一半的半成品…
【游戏】 一、规则机制 线上事故:网络一抖直接踢回登录页,重新登录还要排队,火气全从这一脚踢出来。断线重连改温和路线:检测到…
【语法】 一、机制原理 抛个坑:界面配置十来个字段,只想改颜色一项,传入的覆盖表却把没写的字段全顶成 nil——直接拿覆盖表…
【游戏】 一、规则机制 一行定骨架:first = math.floor(offset / ROW_H)。千行列表建一千个节…
【语法】 一、机制原理 隐蔽的坑:给敏感词表去重,用了"排序后相邻比对"的老办法,重复是去掉了,原有优先级顺序也被打乱。去重…
【语法】 一、机制原理 隐蔽的坑:网格数据用 grid[x .. "_" .. y] 拼字符串键存取,写入顺手,可要遍历整张…