You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

面试算法题:寻找数组中两数和为数组元素的最大和值

解法:找出数组中两数之和为数组元素的最大和

刚看到你这道面试遇到的算法题,我来帮你把代码补全并梳理清楚解法思路:

问题回顾

给定一个数组,找出两个数,它们的和是数组中的元素,且该和为所有符合条件的和中的最大值。

  • 输入示例:6 10 12 34 41 16
  • 输出示例:16

完整实现代码

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

public class Solution {
    public static int findMaximumNumbers(int a[]) {
        Set<Integer> set = new HashSet<>();
        // 将数组元素存入集合,实现O(1)时间查询元素是否存在
        for (int n : a) set.add(n);
        // 对数组排序,方便从大到小优先检查更大的和
        Arrays.sort(a);
        int maxSum = Integer.MIN_VALUE;
        
        // 外层从最大元素开始遍历
        for (int i = a.length - 1; i >= 0; i--) {
            // 内层从当前元素的前一个开始,避免重复计算同一对元素
            for (int j = i - 1; j >= 0; j--) {
                int currentSum = a[i] + a[j];
                // 如果当前和存在于数组中,且比已记录的最大值大,则更新
                if (set.contains(currentSum)) {
                    if (currentSum > maxSum) {
                        maxSum = currentSum;
                    }
                }
            }
        }
        // 处理无符合条件的情况,这里返回-1,可根据题目要求调整
        return maxSum == Integer.MIN_VALUE ? -1 : maxSum;
    }

    public static void main(String[] args) {
        int[] input = {6, 10, 12, 34, 41, 16};
        System.out.println(findMaximumNumbers(input)); // 输出16
    }
}

解法思路拆解

  • 快速查询优化:用HashSet存储数组所有元素,把判断“和是否在数组中”的时间复杂度从O(n)降到O(1),整体提升运算效率。
  • 排序优先查大值:对数组升序排序后,从最大的元素开始组合计算和,这样能优先找到更大的符合条件的和,后续如果遇到更小的和可以直接跳过(如果做进一步优化,甚至可以在找到第一个最大可能的和后提前终止循环,当前代码遍历所有组合是为了保证正确性)。
  • 避免重复计算:内层循环从i-1开始,这样不会重复计算a[j]+a[i]a[i]+a[j]的情况,减少不必要的运算。
  • 边界情况处理:如果数组中没有任何两个数的和存在于数组内,返回-1,你可以根据题目要求改成其他返回值或者抛出异常。

内容的提问来源于stack exchange,提问作者NewUser

火山引擎 最新活动