You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取最大子数组的右索引?附示例与问题代码

获取最大子数组右索引的最佳策略

首先得指出你提供的代码存在核心问题:遍历数组时用for i in data拿到的是元素值而非索引,导致max_right_index = i把元素值当成索引存储,逻辑完全错误——示例里返回[1,5]只是巧合(元素6减1刚好是正确索引5),换个用例就会彻底失效。

针对最大子数组的右索引获取,最佳策略是基于Kadane算法的变种,核心是遍历过程中跟踪当前索引,并在子数组和更新最大值时同步记录右端点,具体步骤如下:

  • 遍历数组时必须操作索引而非元素值,这样才能精准定位子数组的边界。
  • 维护current_start变量记录当前子数组的起始索引:当当前子数组的和变为负数(或单独元素比累加和更大)时,重置当前子数组的起始点为当前索引。
  • 每当当前子数组的和超过已记录的最大和时,立即将当前索引设为最大子数组的右索引,同时更新左索引为当前子数组的起始点。

修正后的代码示例

def max_subarray_indices(data):
    if not data:
        return []
    
    # 初始化时以第一个元素作为初始最大子数组,兼容全负数场景
    max_sum = current_sum = data[0]
    max_left = current_start = 0
    max_right = 0
    
    for i in range(1, len(data)):
        # 判断是否需要重新开始一个子数组
        if data[i] > current_sum + data[i]:
            current_sum = data[i]
            current_start = i
        else:
            current_sum += data[i]
        
        # 更新最大子数组的边界
        if current_sum > max_sum:
            max_sum = current_sum
            max_left = current_start
            max_right = i
    
    return [max_left, max_right]

关键逻辑说明

  1. 兼容全负数场景:原代码初始max_sum=0会忽略全负数的最大子数组,修正后以第一个元素初始化,确保能正确处理所有元素为负的情况。
  2. 实时更新右索引:每次当前子数组和超过最大值时,当前索引就是该最大子数组的右端点,直接赋值给max_right即可,无需后续调整。
  3. 动态调整起始点:当单独元素比累加和更优时,重置当前子数组的起始点,保证后续计算的子数组都是潜在的最大和候选。

内容的提问来源于stack exchange,提问作者Pierre-Alexandre

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 21:27:34