/*
 * @Description: 
 * @Autor: kindring
 * @Date: 2022-05-17 09:55:38
 * @LastEditors: kindring
 * @LastEditTime: 2022-05-17 10:47:27
 * @LastDescript: 
 */
// 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

// 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

// 你可以按任意顺序返回答案。

// 来源:力扣(LeetCode)
// 链接:https://leetcode.cn/problems/two-sum
// 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
// let nums = [2, 7, 11, 15],
//     target = 9;


/**
 * 两数之和,时间优先,可优化
 * @param {*} _nums 
 * @param {*} _target 
 * @returns 
 */
function answer1(_nums, _target) {
    let map = new Map();
    for (let i = 0; i < _nums.length; i += 2) {
        if ((_nums[i] + _nums[i + 1]) == _target) {
            return [i, i + 1]
        } else if ((_nums[i] + _nums[i - 1]) == _target) {
            return [i, i - 1]
        } else {
            if (map.has(_target - _nums[i - 1])) {
                console.log('1');
                if (map.get(_target - _nums[i - 1]) != i - 1) {
                    return [map.get(_target - _nums[i - 1]), i - 1]
                }
            } else if (map.has(_target - _nums[i])) {
                return [map.get(_target - _nums[i]), i];
            } else if (map.has(_target - _nums[i + 1])) {
                return [map.get(_target - _nums[i + 1]), i + 1];
            }
        }
        map.set(map.set(_nums[i - 1], i - 1));
        map.set(map.set(_nums[i], i));
        map.set(map.set(_nums[i + 1], i + 1));
    }
}

// 空间优先
function answer2(_nums,_target){
    let i = 0;
    while (true) {
        _target - _nums[i];
        i++;
    }
}

console.log(answer1([3, 2, 4], 6));
console.log(answer1([2, 7, 11, 15], 9));;
console.log(answer1([-1, -2, -3, -4, -5], -8));; //[2,4]]