Python栈的应用:寻找最长连续子数组的和

2023-04-10 00:00:00 数组 连续 最长

以下是Python代码实现:

def find_longest_subarray(arr):
    """
    寻找最长连续子数组的和
    :param arr: 数组
    :return: 最长连续子数组的和
    """
    stack = []  # 存储连续子数组的起始下标
    res = float('-inf')  # 最大和初始化为负无穷
    for i in range(len(arr)):
        if not stack or arr[i] >= stack[-1] + arr[stack[-1]]: # 当前元素大于等于栈顶元素加上栈顶元素的和
            stack.append(i)
        else: # 当前元素小于栈顶元素加上栈顶元素的和
            start = stack.pop() # 弹出栈顶元素作为连续子数组的起始下标
            res = max(res, sum(arr[start:i])) # 更新最大值
            i -= 1 # 重新检查当前元素
    # 检查堆栈中遗留的元素
    while stack:
        start = stack.pop()
        res = max(res, sum(arr[start:]))
    return res

# 测试代码
arr1 = [1, -2, 3, 10, -4, 7, 2, -5]
arr2 = [1, -2, 3, 10, -4, 7, 2, -5, 8]
arr3 = [-1, -2, -3, -4, -5]
arr4 = [1, 2, 3]
arr5 = [-1, 2, -3]
arr6 = [0, 0, 0]
print(find_longest_subarray(arr1))  # 输出:18
print(find_longest_subarray(arr2))  # 输出:18
print(find_longest_subarray(arr3))  # 输出:-1
print(find_longest_subarray(arr4))  # 输出:6
print(find_longest_subarray(arr5))  # 输出:2
print(find_longest_subarray(arr6))  # 输出:0

相关文章