剑指Offer 57 - 和为s的两个数字

力扣链接:https://leetcode-cn.com/problems/he-wei-sde-liang-ge-shu-zi-lcof/

题目描述

输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。

 

思路1: 哈希表

先建立以(nums[i], i)为键值对的哈希表,再在哈希表中查找有没有符合条件的数字。

代码:

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function(nums, target) {
    let map = new Map();
    for(let i = 0; i < nums.length; i++){
        map.set(nums[i], i);
    }
    
    for(let i = 0; i < nums.length; i++){
        let rest = target - nums[i];
        if(map.has(rest) && map.get(rest) !== i){
                return [nums[i], rest];
        }
    }

    return [];
};

时间复杂度: O(N)

空间复杂度: O(N)

 

思路2: 双指针

利用数组已经排序的特点,一个指针指向高位一个指向低位,如果两数和大于target,说明高位数字太大,高位指针前移,否则说明低位数字太小,低位指针后移。

代码:

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function(nums, target) {
    let low = 0, high = nums.length-1;
    while(low < high){
        let sum = nums[low] + nums[high]; 
        if(sum > target){
            high--;
        }else if(sum < target){
            low++;
        }else{
            return [nums[low], nums[high]];
        }
    }
    
    return[];
};

时间复杂度: O(N)

空间复杂度: O(1)

 

posted @ 2020-07-13 22:06  studystudyxinxin  阅读(123)  评论(0编辑  收藏  举报