剑指 Offer 57. 和为s的两个数字
方法一:Set
set中存target - num,当遇到num时返回。或者set中存num,当遇到target - num时返回。
1 /** 2 * @param {number[]} nums 3 * @param {number} target 4 * @return {number[]} 5 */ 6 var twoSum = function(nums, target) { 7 let hash = new Set(); 8 for(num of nums) { 9 if(hash.has(target - num)) { 10 return [num, target - num]; 11 }else { 12 hash.add(num); 13 } 14 } 15 return null; 16 };
方法二 双指针
题设给的nums是有序的,所以用i j两个指针从前后同时寻找,两数之和大于target时 j 左移,小于target时 i 右移。
1 /** 2 * @param {number[]} nums 3 * @param {number} target 4 * @return {number[]} 5 */ 6 var twoSum = function(nums, target) { 7 if(nums.length < 2) return null; 8 let res = [], i = 0, j = nums.length - 1; 9 while(i < j) { 10 if(nums[i] + nums[j] == target) return [nums[i], nums[j]]; 11 if(nums[i] + nums[j] > target) { 12 j--; 13 }else { 14 i++; 15 } 16 } 17 return null; 18 };

#
浙公网安备 33010602011771号