题目
给你一个下标从 1 开始的整数数组 numbers
,该数组已按非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target
的两个数。
输入: numbers = [2,7,11,15], target = 9 输出: [1,2] 解释: 2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。返回 [1, 2] 。
思路一
因为nums是递增数组,所以我们可以利用两个指针,让l变量指向开始的元素,r变量指向最后一位元素,然后通过循环逐渐往中间移动来寻找合适的值,如果l变量指向的元素和r变量指向的元素相加大于目标值,就把r变量值左移一位,如果l变量指向的元素和r变量指向的元素相加小于目标值,就把l变量值右移一位,最后找到合适的l变量和r变量,返回出去即可
/** * @param {number[]} numbers * @param {number} target * @return {number[]} */ var twoSum = function(numbers, target) { let l = 0, r = numbers.length - 1 while(l < r) { if (numbers[l] + numbers[r] > target) { r-- } else if(numbers[l] + numbers[r] < target) { l++ } else { return [l + 1, r + 1] } } };
思路二
我们可以用Map数据结构来实现,我们使用map变量存储一下Map数据结构实例,然后声明a和b两个变量默认值都为0,然后使用循环,在循环中使用has方法进行判断当前map数据中是否包含当前值,如果包含则更新a变量和b变量,然后再讲值添加到map数据结构中,在声明一个arr变量,默认是空数组,然后使用if判断将a和b变量在arr数组中的位置进行调换,最后将arr变量返回出去即可
/** * @param {number[]} numbers * @param {number} target * @return {number[]} */ var twoSum = function (numbers, target) { let map = new Map(); let a = 0, b = 0; for (let i = 0; i < numbers.length; i++) { let count = target - numbers[i]; if (map.has(count)) { a = i + 1; b = map.get(count) + 1; } map.set(numbers[i], i); } let arr = []; if (a > b) { arr = [b, a]; } else { arr = [a, b]; } return arr; };