算法思路

题目要求计算数组中两数之和等于特定值的组合,首先很容易想到的一种算法是把该数组每一个值及其下标存到一个Map里面;然后再次遍历数组,看Map中是否有补数(特定值与当前值之差)存在,有的话说明找到了,否则继续找;
事实上,我们只需要遍历一遍数组就可以了:在遍历数组的过程中如果没有找到补数,就把当前数以及下标存到Map中,这样除了少遍历一次外,还有一个好处是可以保证当前数的下标要小于从Map中取出的补数的下标(题目要求按照下标出现顺序返回结果)。

算法实现

public class Solution {
    public int[] twoSum (int[] numbers, int target) {
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < numbers.length; i++) {
            // 补数的下标
            Integer index = map.get(target - numbers[i]);
            if (index == null) {
                map.put(numbers[i], i);
            } else {
                // 数组下标从1开始
                return new int[]{index + 1, i + 1};
            }
        }
        // 没有找到则返回null
        return null;
    }
}