python:和最大的连续子数组

460 阅读1分钟
def main(temp_list):
    # 计算列表的长度,因为要逐个遍历列表中的元素
    n = len( temp_list )
    if n <= 1:
        print(temp_list,'该数组为空/或只有一个元素')

    # 先初始化一个最大值 max_value
    # 如果在执行的过程中,有比max_value大的值,则替换
    # 这就是动态规划
    max_value = -1000000000000

    # 初始化一个中间结果
    temp_value = 0
    
    # 连续子列表的开始index 和 结束index 
    start_index = 0
    end_index = 0

    index_list = []

    for i in range(n):
        # 如果当前的temp_value+temp_list[i]这个元素,比temp_list[i]还小
        # 说明temp_value不是最大的值,temp_list[i]是更大的值,
        # 就可以把之前的temp_value舍弃掉,从temp_list[i]重新找,所以start_index设置为i
        # end_index,只所以设置为1,是因为后期end_index会自动+1
        # 然后最后的end_index = start_index + end_index
        
        if temp_value + temp_list[i] < temp_list[i]:
            start_index = i
            end_index = 1
        else:
            end_index += 1
        
        # 2者中去最大的
        temp_value = max (   temp_value + temp_list[i],  temp_list[i]    )
        
        # 2者中取最大的
        max_value = max(  max_value, temp_value  )

        if temp_value == max_value:
            index_list.append(    [start_index, start_index+end_index]     )
    
    # 最后打印最大的和max_value,以及开始和结束的位置
    print( max_value, index_list[-1] )


if __name__ == '__main__':
    a = [5,-7,3,5,-2,4,-1]
    main(a)