题目描述
思路解析动画文字版
思路:按长度 1、3、5 分组枚举,每段算和累加进 total。下面每一帧圈出一段,并把它的和加进 total。
先看长度为 1 的子数组:左端点从下标 0 开始,每次右移一格,把每一段都圈出来累加。
圈出从下标 0 到 0 这一段(长度 1),它的和是 1 = 1。
把这段的和 1 加进 total,total 变成 1。
圈出从下标 1 到 1 这一段(长度 1),它的和是 4 = 4。
把这段的和 4 加进 total,total 变成 5。
圈出从下标 2 到 2 这一段(长度 1),它的和是 2 = 2。
把这段的和 2 加进 total,total 变成 7。
圈出从下标 3 到 3 这一段(长度 1),它的和是 5 = 5。
把这段的和 5 加进 total,total 变成 12。
圈出从下标 4 到 4 这一段(长度 1),它的和是 3 = 3。
把这段的和 3 加进 total,total 变成 15。
先看长度为 3 的子数组:左端点从下标 0 开始,每次右移一格,把每一段都圈出来累加。
圈出从下标 0 到 2 这一段(长度 3),它的和是 1+4+2 = 7。
把这段的和 7 加进 total,total 变成 22。
圈出从下标 1 到 3 这一段(长度 3),它的和是 4+2+5 = 11。
把这段的和 11 加进 total,total 变成 33。
圈出从下标 2 到 4 这一段(长度 3),它的和是 2+5+3 = 10。
把这段的和 10 加进 total,total 变成 43。
先看长度为 5 的子数组:左端点从下标 0 开始,每次右移一格,把每一段都圈出来累加。
圈出从下标 0 到 4 这一段(长度 5),它的和是 1+4+2+5+3 = 15。
把这段的和 15 加进 total,total 变成 58。
长度 1、3、5 的所有段都累加完了,total = 58 就是最终答案。
三个高频追问:为什么步长 2、复杂度能否优化、以及 O(n) 数学公式的核心计数。
参考代码
def sumOddLengthSubarrays(arr): n = len(arr) total = 0 length = 1 # 只取奇数长度 while length <= n: s = 0 # 左端点 while s + length <= n: total += sum(arr[s:s+length]) s += 1 length += 2 # 1,3,5,... return total复杂度
- 时间:O(n³),枚举长度与左端点是 O(n²) 段,每段再求和是 O(n),朴素枚举共 O(n³)
- 空间:O(1),只用 total 一个累加器和几个循环变量,不开额外数组
易错点
面试追问把动画讲成自己的话
追问为什么长度从 1 开始、每次加 2?
追问这个朴素解法的时间复杂度是多少?能优化吗?
追问怎么算一个元素被多少个奇数长度子数组包含?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
检查两个字符串数组是否相等
LeetCode 1662 · 简单 · 沿着 数组套路 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题