📅  最后修改于: 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_sum
和 cur_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)$,因为我们只遍历了整个数组一次。
以上是查找数组中最小的连续和对的两种解法,效率都很高。第一种方法简单易懂,但复杂度较高;第二种方法略微复杂,但复杂度较低。根据具体的要求和数据规模选择合适的算法。