📌  相关文章
📜  在未排序的数组中找到最大的对和(1)

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

在未排序的数组中找到最大的对和

在给定的未排序数组中,需要找到最大的数字对之和。

解法一:暴力枚举

最简单直接的做法是通过两层循环枚举所有数字对,计算它们的和并更新最大值。

代码实现
def find_max_pair_sum(arr):
    n = len(arr)
    max_sum = float('-inf')
    for i in range(n-1):
        for j in range(i+1, n):
            if arr[i] + arr[j] > max_sum:
                max_sum = arr[i] + arr[j]
    return max_sum
复杂度分析
  • 时间复杂度:$O(n^2)$
  • 空间复杂度:$O(1)$
解法二:排序+双指针

通过将数组排序,可以将最大的数字对移动到数组两端,然后使用指针从两端向中心移动来计算最大的数字对之和。

代码实现
def find_max_pair_sum(arr):
    arr.sort()
    left, right = 0, len(arr) - 1
    max_sum = float('-inf')
    while left < right:
        cur_sum = arr[left] + arr[right]
        if cur_sum > max_sum:
            max_sum = cur_sum
        left += 1
        right -= 1
    return max_sum
复杂度分析
  • 时间复杂度:排序的时间复杂度为 $O(n\log n)$,指针移动的时间复杂度为 $O(n)$,因此总时间复杂度为 $O(n\log n)$。
  • 空间复杂度:排序所需的额外空间开销为 $O(n)$,因此空间复杂度为 $O(n)$。
解法三:单次遍历

可以在单次遍历数组时记录最大数和次大数,然后计算它们的和即可。

代码实现
def find_max_pair_sum(arr):
    max_num, second_max = float('-inf'), float('-inf')
    for num in arr:
        if num > max_num:
            second_max = max_num
            max_num = num
        elif num > second_max:
            second_max = num
    return max_num + second_max
复杂度分析
  • 时间复杂度:单次遍历数组的时间复杂度为 $O(n)$。
  • 空间复杂度:常数额外空间开销,因此空间复杂度为 $O(1)$。