前端算法-输入有序数组

55 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第16天,点击查看活动详情

题目

给你一个下标从 1 开始的整数数组 numbers ,该数组已按非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。

输入: numbers = [2,7,11,15], target = 9
输出: [1,2]
解释: 27 之和等于目标数 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;
};