题目描述
思路解析动画文字版
记住「no 是普通最大子段和,yes 是已用平方的最大子段和,yes 取三种来法的最大」,下面每一帧都在套它。
读第 0 个 2。先更新 no(没用平方的最大子段和):从 2 自己重开更划算,no=2。
更新 yes:把 2 平方成 4 最划算,yes=4(红色标出被平方的元素)。刷新 ans=4。
读第 1 个 -1。先更新 no(没用平方的最大子段和):接在前面后面更划算,no=2+-1=1。
更新 yes:平方留在更早的位置、当前元素正常加进来更划算,yes=3。没超过 ans=4。
读第 2 个 -4。先更新 no(没用平方的最大子段和):接在前面后面更划算,no=1+-4=-3。
更新 yes:把 -4 平方成 16 最划算,yes=17(红色标出被平方的元素)。刷新 ans=17。
读第 3 个 -3。先更新 no(没用平方的最大子段和):从 -3 自己重开更划算,no=-3。
更新 yes:平方留在更早的位置、当前元素正常加进来更划算,yes=14。没超过 ans=17。
读第 4 个 1。先更新 no(没用平方的最大子段和):从 1 自己重开更划算,no=1。
更新 yes:平方留在更早的位置、当前元素正常加进来更划算,yes=15。没超过 ans=17。
读第 5 个 -5。先更新 no(没用平方的最大子段和):接在前面后面更划算,no=1+-5=-4。
更新 yes:把 -5 平方成 25 最划算,yes=26(红色标出被平方的元素)。刷新 ans=26。
读第 6 个 2。先更新 no(没用平方的最大子段和):从 2 自己重开更划算,no=2。
更新 yes:平方留在更早的位置、当前元素正常加进来更划算,yes=28。刷新 ans=28。
读第 7 个 3。先更新 no(没用平方的最大子段和):接在前面后面更划算,no=2+3=5。
更新 yes:平方留在更早的位置、当前元素正常加进来更划算,yes=31。刷新 ans=31。
读第 8 个 -2。先更新 no(没用平方的最大子段和):接在前面后面更划算,no=5+-2=3。
更新 yes:平方留在更早的位置、当前元素正常加进来更划算,yes=29。没超过 ans=31。
读第 9 个 4。先更新 no(没用平方的最大子段和):接在前面后面更划算,no=3+4=7。
更新 yes:平方留在更早的位置、当前元素正常加进来更划算,yes=33。刷新 ans=33。
扫完全程,最优是绿色这段 [下标 4..9],其中把红色的 nums[5]=-5 平方成 25,整段和 = 33。一遍扫描、两个状态就锁定了答案。
边界先想清:单元素也要平方;负数平方常常是最优。
认出「Kadane + 一维操作状态」这个母题,一类题通吃。
参考代码
from typing import Listclass Solution: def maxSumAfterOperation(self, nums: List[int]) -> int: no = 0 yes = -10**30 ans = -10**30 for x in nums: old_no = no no = max(no + x, x) yes = max(yes + x, old_no + x * x, x * x) ans = max(ans, yes) return ans复杂度
- 时间:O(n),扫一遍数组
- 空间:O(1),只用 no、yes、ans 三个变量
易错点
面试追问把动画讲成自己的话
追问这和普通最大子数组和(Kadane / LC53)什么关系?
追问如果是“最多平方一次”而非“必须平方一次”呢?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
解决智力题
LeetCode 2140 · 中等 · 沿着 动态规划套路 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题