leetcode 1.两数之和

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

解法一:for双重循环

var twoSum = function(nums, target) {
    var arr = [];
    for (var i = 0; i < nums.length-1; i++){
        let a = target - nums[i];
        for (var j = i+1; j < nums.length; j++){
            if(a === nums[j]){
                 arr.push(i);
                 arr.push(j);
                 return arr
            }
        }
    }
    return false
};

解法二:map + indexOf方法

var twoSum = function (nums, target) {
        let arr = []
        nums.map( (item,index) => {
            if(nums.indexOf(target - item) > -1 && nums.indexOf(target - item) != index){
            arr = [index,nums.indexOf(target - item)].sort((a,b)=> a-b)
        }
        })
        return arr
    }

map遍历数组,item是数组中的每一项,index是下标值

indexOf返回元素在数组中第一次出现的位置

sort对要返回的数组排序

 解法三:双指针法

着如果方法有点类似二分法查找,只不过不需要设置中间值。因为数组是排好序的,所有可以用双指针查找,前后各一个指针开始走,如果两数之和大于target,就让后面的指针向前走,这样值会小一些,如果两数之和小于target,就让前边的指针向后走,这样值会越来越大

var twoSum = function(numbers, target) {
    let result = []
    let left  = 0
    let right = numbers.length -1
    while(left < right) {
        if(numbers[left] + numbers[right] === target) {
            result.push(left+1)
            result.push(right+1)
            break
        }else if(numbers[left] + numbers[right] > target) {
            right--
        }else {
            left++
        }
    }
    return result
};

解法三的性能相对比前两个要好一些

不积跬步无以至千里
原文地址:https://www.cnblogs.com/lyt0207/p/12405525.html