剑指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)