📜  查找数组中最小的连续和对(1)

📅  最后修改于: 2023-12-03 14:55:34.475000             🧑  作者: Mango

查找数组中最小的连续和对

简介

给定一个由整数组成的数组,你需要找到最小的连续和对。

连续和对是指数组中相邻的两个元素之和。

例如,对于数组 [1, -2, 3, -4, 5],最小的连续和对为 [-2, 3],因为它们的和为 -2 + 3 = 1,是所有连续和对中最小的。

解法

一个朴素的解法是枚举所有连续的子数组,计算它们的和,然后找到最小的和。

def min_sum_pair(arr):
    n = len(arr)
    min_sum = float('inf')
    pair = None
    for i in range(n - 1):
        for j in range(i + 1, n):
            s = arr[i] + arr[j]
            if s < min_sum:
                min_sum = s
                pair = (arr[i], arr[j])
    return pair

这个解法的时间复杂度是 $O(n^2)$,对于较长的数组会很慢。

一种更快的解法是通过遍历数组一次来计算最小和。我们可以使用两个变量 min_sumcur_sum 来跟踪目前的最小和和当前的子数组和。

当我们遍历到下一个元素时,如果当前子数组的和变成了负数,那么从前面的部分开始重新计算子数组和。这是因为如果前面的子数组的和为负数,那么它们不会对当前子数组的最小和有任何贡献。

def min_sum_pair(arr):
    n = len(arr)
    min_sum = float('inf')
    pair = None
    i = 0
    j = 1
    cur_sum = arr[i] + arr[j]

    while j < n:
        if cur_sum < min_sum:
            min_sum = cur_sum
            pair = (arr[i], arr[j])
        if cur_sum < 0:
            i = j
            j += 1
            cur_sum = arr[i] + arr[j] if j < n else float('inf')
        else:
            j += 1
            cur_sum += arr[j] if j < n else float('inf')

    return pair

这个解法的时间复杂度是 $O(n)$,因为我们只遍历了整个数组一次。

总结

以上是查找数组中最小的连续和对的两种解法,效率都很高。第一种方法简单易懂,但复杂度较高;第二种方法略微复杂,但复杂度较低。根据具体的要求和数据规模选择合适的算法。