【语法】
一、隐蔽陷阱
一天的收益流水有正有负,想知道连续哪一段时间合计最高:枚举起点终点是 n² 次累加,500 笔流水要做 12.5 万次——能不能只扫一遍?
二、底层原理
Kadane 思路:滚动维护"以当前笔结尾的最大合计"。每一笔要么接在前段之后,要么自己另起一段,选择的标准就看前段合计是不是正贡献;全局另记一个历史最大值。正负交错的一串数,一次扫描 n 步出答案。
三、正确代码
基础写法(枚举起点终点,n² 次):
local function maxRange(nums)
local best = nums[1]
for i = 1, #nums do
local s = 0
for j = i, #nums do
s = s + nums[j]
if s > best then best = s end
end
end
return best
end
进阶写法(一遍扫描):
local function maxSeg(nums)
local best, cur = nums[1], 0
for i = 1, #nums do
cur = math.max(nums[i], cur + nums[i])
best = math.max(best, cur)
end
return best
end
local p = getplayerbyname("flow01")
sendmsg(p, 1, "最佳连续段合计 " .. maxSeg({8, -3, 5, -7, 10}))
四、引擎验证
样例 {8,-3,5,-7,10} 输出 13,与全段合计一致;500 笔流水从 12.5 万次累加降到 500 步,快 250 倍。
五、FAQ
问:全负数怎么办?
答:返回最大单笔,当前写法天然支持。
问:要输出起止位置呢?
答:更新历史最大值时同步记下界标即可。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏】 一、规则机制 线上事故:玩家装备耐久打空才发现,战力拦腰砍半,打不动怪又投诉掉率。耐久提醒立双档:耐久低于三成弹黄…
【语法】 一、机制原理 抛个坑:行列表格要变成列行,每格都搬一遍还新建了整张表——方形矩阵能不能原地换?转置沿对角线折返:只…
【游戏】 一、规则机制 隐蔽的坑:"最近浏览"里同一件商品重复出现五六次,足迹成了复读机。浏览足迹立两条:每次查看先在足迹里…
【语法】 一、机制原理 一行代码拆解:local bucket = math.floor(v / width)。数值分布统计…
【语法】 一、机制原理 一行代码拆解:setmetatable(cfg, {__index = DEFAULTS})。配置对…
【游戏】 一、规则机制 线上事故:结算时玩家追问"我到底打了多少",战斗中没有任何实时输出面板,事后对不上账。输出统计两步走…