1. 程式人生 > >[Daily Coding Problem] 1 (LeetCode 1). Find if two numbers in an array add up to k

[Daily Coding Problem] 1 (LeetCode 1). Find if two numbers in an array add up to k

This problem was recently asked by Google.

Given a list of numbers and a number k, return whether any two numbers from the list add up to k.

For example, given [10, 15, 3, 7] and k of 17, return true since 10 + 7 is 17.

Bonus: Can you do this in one pass?

 

經典2-sum問題的變形.  最直觀的做法是first pass, 用HashMap儲存每個數和其index的mapping關係, 然後second pass來尋找是否有滿足要求的。 需要注意的一點是,同一個位置的數字不能使用兩次.

 1 public class Solution {
 2     public int[] twoSum(int[] nums, int target) {
 3         Map<Integer, Integer> hm = new HashMap<Integer, Integer>();
 4
for(int i = 0; i < nums.length; i++) 5 { 6 hm.put(nums[i], i); 7 } 8 9 for(int i = 0; i < nums.length; i++) 10 { 11 if(hm.containsKey(target - nums[i]) && i != hm.get(target - nums[i])) 12 { 13 int
[] r = new int[2]; 14 r[0] = i; 15 r[1] = hm.get(target - nums[i]); 16 return r; 17 } 18 } 19 return null; 20 } 21 }

 

1 pass solution 就是一邊掃描陣列, 一邊更新Map。 如果找到滿足要求的pair, 直接返回, 否則把當前的數插入到Map中.

 1 public class Solution {
 2     public int[] twoSum(int[] nums, int target) {
 3         Map<Integer, Integer> map = new HashMap<Integer, Integer>();
 4         for(int i = 0; i < nums.length; i++) {
 5             if(map.containsKey(target - nums[i])) {
 6                 int[] r = new int[2];
 7                 r[0] = map.get(target - nums[i]);
 8                 r[1] = i;
 9                 return r;
10             }
11             else {
12                 map.put(nums[i], i);
13             }
14         }
15         return null;
16     }
17 }