面试算法题:寻找数组中两数和为数组元素的最大和值
解法:找出数组中两数之和为数组元素的最大和
刚看到你这道面试遇到的算法题,我来帮你把代码补全并梳理清楚解法思路:
问题回顾
给定一个数组,找出两个数,它们的和是数组中的元素,且该和为所有符合条件的和中的最大值。
- 输入示例:
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




