Python求解最长奇偶交替子序列代码索引错误原因排查
报错原因及代码问题梳理
索引错误的直接原因
你出现索引错误和j是否小于i没有任何关系,核心问题是sln数组没有初始化:
- 你代码里定义
sln = [],全程没有往里面添加任何元素,数组长度始终为0。当i=1进入内层循环要访问sln[i]也就是sln[1]的时候,空数组根本没有对应索引的元素,自然触发索引越界。
其他代码逻辑问题
除了初始化问题,你的代码还有多处不符合题目要求的错误:
- 动态规划初始值缺失
这类问题中sln[i]通常表示以第i个元素结尾的最长奇偶交替子序列长度,初始值应该全为1,因为单个元素本身就是长度为1的合法子序列,需要在循环前补充sln = [1] * n。 - 奇偶交替判断逻辑错误
当A[i]是奇数时,前一个元素需要是偶数才符合交替要求,你代码里写的是A[j]%2==1,完全不满足奇偶交替的条件。 - 多余的递增判断
题目仅要求子序列奇偶交替,没有要求严格递增,你加的A[j] < A[i]属于额外限制,会导致结果错误。 - 计算结果未赋值
else分支里的max(sln[i],sln[j]+1 )没有赋值给sln[i],计算结果直接丢弃,逻辑不生效。 - 返回值错误
你直接返回sln列表,题目要求返回最长子序列的长度,应该返回max(sln)。
修正后参考代码
def solve(A): n = len(A) if n == 0: return 0 sln = [1] * n for i in range(n): for j in range(i): # 只要奇偶不同就符合交替要求 if A[i] % 2 != A[j] % 2: sln[i] = max(sln[i], sln[j] + 1) return max(sln) A = [1, 2, 2, 5, 6] print(solve(A)) # 输出5,对应合法子序列如[1,2,5,6]等
内容的提问来源于stack exchange,提问作者Maws
相关产品推荐
相关产品推荐

