如何修正求解最长连续递增子数组的Python代码?
修正最长连续递增子数组的Python代码
问题描述
需求:找出数组中的最长连续递增子数组(连续指元素在原数组中位置相邻,递增指后一个元素大于前一个)。
示例:输入 [1,2,3,1,5,7,8,9],输出 [1,5,7,8,9]
原代码问题分析
第一段代码问题
def longsub(l): newl = [] for i in range(len(l)) : if l[i] < l[i+1] : newl.append(l[i]) else : newl = [] return newl
- 直接错误:循环到数组最后一个元素时,
i+1超出数组索引范围,触发list index out of range报错。 - 逻辑缺陷:仅记录当前递增序列的部分元素,完全没保存历史最长的序列,最终返回的只是最后一段递增序列的片段,不符合需求。
第二段代码问题
def longsub(l): newl = [] for i in range(len(l)) : if l[i] > l[i-1] : newl.append(l[i]) else : newl = [] return newl
- 直接错误:
i=0时,l[i-1]会取到数组最后一个元素,逻辑完全错误;同时递增子数组的首个元素永远不会被加入newl,因为只有当前元素大于前一个时才执行添加操作,首元素没有前置触发条件。 - 逻辑缺陷:同样未保存历史最长序列,最终返回的只是最后一段递增序列的部分元素,不符合需求。
修正后的代码
我们需要同时跟踪当前递增序列和历史最长序列,同时处理边界情况:
def longsub(l): if not l: # 处理空数组的边界情况 return [] max_seq = [l[0]] current_seq = [l[0]] for i in range(1, len(l)): if l[i] > l[i-1]: current_seq.append(l[i]) # 当前序列长度超过最长序列时,更新最长序列 if len(current_seq) > len(max_seq): max_seq = current_seq.copy() # 用copy避免后续修改current_seq同步影响max_seq else: # 重置当前序列为仅包含当前元素 current_seq = [l[i]] return max_seq
代码说明
- 初始化:
max_seq存历史最长的递增序列,current_seq存当前正在遍历的递增序列,初始都包含数组第一个元素。 - 循环从索引1开始,避免
i-1越界。 - 当当前元素大于前一个时,加入当前序列;如果当前序列长度超过最长序列,就更新最长序列(必须用
copy(),因为列表是引用类型,直接赋值会导致后续修改current_seq时同步改动max_seq)。 - 当当前元素不大于前一个时,重置当前序列为仅包含当前元素,重新开始统计新的递增序列。
- 提前处理空数组,避免后续逻辑报错。
测试示例:
print(longsub([1,2,3,1,5,7,8,9])) # 输出: [1,5,7,8,9] print(longsub([5,4,3,2,1])) # 输出: [5] print(longsub([])) # 输出: [] print(longsub([1,3,2,4,5,6])) # 输出: [2,4,5,6]
内容的提问来源于stack exchange,提问作者CCM
相关产品推荐
相关产品推荐

