import java.util.HashMap;


public class Solution {
    /**
     * 
     * @param numbers int整型一维数组 
     * @param target int整型 
     * @return int整型一维数组
     */
    public int[] twoSum (int[] numbers, int target) {
        // write code here
        /******************************************************************************************************/
        // 以下方法仅限于数据量不大的情况下可以使用!!!
        /*
        // 定义一个偏移量
        int p = 1;
        // 定义一个整型变量,用于存放临时数据
        int val = 0;
        // 定义一个整型数组,用于存放最终的返回结果
        int[] rs = new int[2];
        for (int i = 0; i < numbers.length; i++) {
            val = numbers[i]; // 获取一个数
            while ((i + p) < numbers.length) {
                if ((val + numbers[i + p]) == target) { // 如果相等,那再好不过了,直接退出循环
                    rs[0] = i + 1;
                    rs[1] = i + p + 1;
                    return rs;
                }
                else {
                    p++; // 继续向后寻找,直到找到或者数组越界
                }
            }
            // 可以确定,这个数组中真的没有一个数与当前位置上的数相加等于 target
            p = 1; // 别忘了重新将 p 值置为 1
        }
        return rs;
        */
        HashMap<Integer, Integer> hm = new HashMap<>(); // 存放的是 (numbers[i], i)
        int val = 0; // 定义一个整型变量,用于存放临时数据
        int[] rs = new int[2]; // 定义一个整型数组,用于保存最终的返回结果
        for (int i = 0; i < numbers.length; i++) { // 依次遍历 numbers 数组中的元素
            val = numbers[i];
            if (hm.containsKey(target - val)) { // 如果 HashMap 中存放了与当前数相加为 target 的数
                rs[0] = hm.get(target - val) + 1;
                rs[1] = i + 1;
                break;
            }
            else { // 如果 HashMap 中没有存放与当前数组相加为 target 的数
                hm.put(numbers[i], i); // 将当前数 put 到 HashMap 中
            }
        }
        return rs;
    }
}