Two Sum

Given an array of integers, find two numbers such that they add up to a specific target number.

The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please note that your returned answers (both index1 and index2) are NOT zero-based.

Notice

You may assume that each input would have exactly one solution.

Example

numbers=[2, 7, 11, 15], target=9

return [1, 2]

这道题有两种解法,可能是受前面题目影响,第一思路是O(nlogn)的,先排序,从两边往中间找。

代码如下:

public class Solution {
    /*
     * @param numbers : An array of Integer
     * @param target : target = numbers[index1] + numbers[index2]
     * @return : [index1 + 1, index2 + 1] (index1 < index2)
     */
    public int[] twoSum(int[] numbers, int target) {
        Pair[] number = new Pair[numbers.length];
        for (int i = 0; i < numbers.length; i++) {
            number[i] = new Pair(i, numbers[i]);
        }
        Arrays.sort(number, new Comparator<Pair>() {
            public int compare(Pair a, Pair b) {
                return a.num - b.num;
                }
                });
        int left = 0;
        int right = numbers.length - 1;
        int[] res = new int[2];
        while (left < right) {
            if (number[left].num + number[right].num > target) {
                right--;
            } else if (number[left].num + number[right].num < target) {
                left++;
            } else {
                int[] tmp = {number[left].index, number[right].index};
                Arrays.sort(tmp);
                res[0] = tmp[0] + 1;
                res[1] = tmp[1] + 1;
                break;
            }
        }
        return res;
    }
}

class Pair {
    int index;
    int num;
    Pair(int index, int num) {
        this.index = index;
        this.num = num;
    }
}

 

还有一种解法是利用hashmap,和前面某题思路差不多,应该多想想能想到的。。。以后多想想hashmap,明显代码简洁了不少。

代码如下:

public class Solution {
    /*
     * @param numbers : An array of Integer
     * @param target : target = numbers[index1] + numbers[index2]
     * @return : [index1 + 1, index2 + 1] (index1 < index2)
     */
    public int[] twoSum(int[] numbers, int target) {
        HashMap<Integer, Integer> res = new HashMap<>();
        
        for (int i = 0; i < numbers.length; i++) {
            if (res.containsKey(target - numbers[i])) {
          //这里注意一下顺序就不用再手动排一次了
int[] re = {res.get(target - numbers[i]) + 1, i + 1}; return re; } res.put(numbers[i], i); } int[] re = {}; return re; } }

 

posted @ 2017-01-09 08:59  璨璨要好好学习  阅读(127)  评论(0编辑  收藏  举报