459 查找和为指定数的数组数字 | 豆包MarsCode AI刷题

66 阅读2分钟

问题描述

小R有一个按升序排序的整数数组,他的任务是查找其中两数,使得它们的和等于给定的目标数字。如果存在多对符合条件的数字,输出找到的第一对数字。若无符合条件的组合,则返回结果异常。每次返回的结果包括是否找到结果的状态及该两数的索引和它们的值。

例如:在输入的数组 [1, 2, 4, 7, 11, 15] 中,找到的第一对和为 6 的数字是 2 和 4

测试样例

样例1:

输入:arr = [1, 2, 4, 7, 11, 15] ,target = 6
输出:[1, 2, 4]

样例2:

输入:arr = [1, 3, 5, 8, 12] ,target = 10
输出:[0, 0, 0]

样例3:

输入:arr = [-10, -3, 0, 4, 5] ,target = 1
输出:[1, -3, 4]

问题理解

数组已经升序排序,要找到第一对数字相加等于目标值,直接从数组由小到大开始遍历判断两个元素相加是否等于目标值即可。

解题思路

  1. 初始化2个变量 num1num2,保存遍历到数组中的元素
  2. 定义要输出的 result 数组,默认为 [0, 0, 0],第一位为结果状态,后两位为两数的值
  3. 从头开始遍历数组,分别计算 num1 和 num2 相加是否等于目标值,如果相等,覆盖 result 的默认值。

代码详解

public static int[] solution(int[] arr, int target) {
        int num1;
        int num2;
        int[] result = new int[]{0, 0, 0};
        for (int i = 0; i < arr.length; i++) {
            for (int j = i + 1; j < arr.length; j++) {
                num1 = arr[i];
                num2 = arr[j];
                if ((num1 + num2) == target) {
                    result[0] = 1;
                    result[1] = num1;
                    result[2] = num2;
                    return result;
                }
            }
        }
        return result;
    }

复杂度计算

空间复杂度:O(1)

时间复杂度:O(n ^ 2)n是题目给定字符串的长度,需要遍历数组的长度

总结

知识点:

  1. 双重循环遍历数组,查找两个数,使得它们的和等于目标值。
  2. 数组操作:使用数组的索引来访问和操作数组元素。
  3. 条件判断:使用条件判断语句 if (arr[i] + arr[j] == target) 来检查两个数的和是否等于目标值。

其余思路

哈希表法

1. 遍历数组,对于每个元素,计算目标值与当前元素的差值。
2.  检查哈希表中是否存在该差值。
3.  如果存在,返回当前元素和哈希表中记录的差值对应的元素。
4. 如果不存在,将当前元素及其索引存入哈希表。
5. 重复上述步骤,直到找到符合条件的数对或遍历完数组。

作者:Hewson
链接:juejin.cn/post/744077…
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。