剑指 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 };

 

posted @ 2021-09-21 17:47  雪之下。  阅读(37)  评论(0)    收藏  举报