开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第16天,点击查看活动详情
题目
给你一个下标从 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;
};