Two Sum

①原題

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

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.算法

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

Input: numbers={2, 7, 11, 15}, target=9
Output: index1=1, index2=2less

public class Solution {
    public int[] twoSum(int[] numbers, int target) {
        
    }
}工具

②鄉村英語翻譯一下

給你一個數字數組,找出來這裏面哪兩個數加起來正好是一個給定的數。spa

你要寫的功能 twoSum 應該返回加起來是目標數的兩個數字的序列,可是請注意,返回的數字是從小到大排列的,而後返回的數字和索引都不是從零蛋開始地。翻譯

你的答案能夠是這樣事的:code

輸入:numbers={2, 7, 11, 15}, target=9排序

輸出:index1=1, index2=2索引

③讀題

1:要寫一個方法,兩個參數,第一個參數是數字數組。第二個是參數是數字,爲目標值。返回值是一個排序數組。

2:題目要求只有一個答案,貌似狀況明朗了一些。

3:遍歷數組是必不可少的,如何減少時間複雜度是該題的核心

④解題

public class Solution {
  //最爛的寫法,兩層循環,時間複雜度 n*n
    public int[] twoSumLow(int[] numbers, int target) {
        int[] returnArray = new int[2];
        boolean flag = false;
        for (int i = 0, j = numbers.length; i < j; i++) {
            if (flag) {
                break;
            }
            int tempNum1 = numbers[i];
            for (int m = numbers.length - i, n = numbers.length; m < n; m++) {
                int tempNum2 = numbers[m];
                if (tempNum1 + tempNum2 == target) {
                    returnArray[0] = tempNum1 < tempNum2 ? tempNum1 : tempNum2;
                    returnArray[1] = tempNum1 < tempNum2 ? tempNum2 : tempNum1;
                    flag = true;
                    break;
                }
            }
        }
        return returnArray;
    }

    //這個靠譜了吧 ,時間更多的消耗在排序上 時間複雜度 n*log(n)
    public int[] twoSum(int[] numbers, int target) {
        Arrays.sort(numbers);
        int[] returnArray = new int[2];
        int i = 0, j = numbers.length - 1;
        boolean flag = false;
        while (!flag) {
            if (numbers[j] > target || numbers[i] + numbers[j] > target) {
                j--;
            }
            if (numbers[i] + numbers[j] < target) {
                i++;
            }
            if (numbers[i] + numbers[j] == target) {
                returnArray[0] = numbers[i];
                returnArray[1] = numbers[j];
                flag = true;
            }
        }
        return returnArray;
    }

    //理論上作算法題應該禁用語言工具的,不過反過來看用語言工具能幫助咱們增長應用語言的能力不是嘛,時間複雜度 n
    public int[] twoSumHash(int[] numbers, int target) {
        HashMap<Integer, Integer> numbersHash = new HashMap<Integer, Integer>(20000);
        int[] returnArray = new int[2];
        for (int i = 0, j = numbers.length; i < j; i++) {
            int tempNum = numbers[i];
            int key = target - tempNum;
            if (numbersHash.get(key) != null) {
                int otherNum = numbersHash.get(key);
                returnArray[0] = tempNum < otherNum ? tempNum : otherNum;
                returnArray[1] = tempNum < otherNum ? otherNum : tempNum;
                break;
            } else {
                numbersHash.put(tempNum, tempNum);
            }
        }
        return returnArray;
    }

    public static void main(String[] args) {
        TwoSum twoSum = new TwoSum();
        int[] numbers = new int[10000];
        ArrayList<Integer> numList = new ArrayList<Integer>(10000);
        for (int i = 0, j = 10000; i < j; i++) {
            numList.add(i + 1);
        }
        Collections.shuffle(numList);
        for (int i = 0, j = 10000; i < j; i++) {
            numbers[i] = numList.get(i);
        }
        long nowTime = System.currentTimeMillis();
        int[] answerArray = twoSum.twoSum(numbers, 19999);
        System.out.println("use time :" + (System.currentTimeMillis() - nowTime));
        System.out.println("Index1:" + answerArray[0]);
        System.out.println("Index2:" + answerArray[1]);

        long nowTimeLow = System.currentTimeMillis();
        int[] answerArrayLow = twoSum.twoSumLow(numbers, 19999);
        System.out.println("use time :" + (System.currentTimeMillis() - nowTimeLow));
        System.out.println("Index1:" + answerArrayLow[0]);
        System.out.println("Index2:" + answerArrayLow[1]);

        long nowTimeHash = System.currentTimeMillis();
        int[] answerArrayHash = twoSum.twoSumHash(numbers, 19999);
        System.out.println("use time :" + (System.currentTimeMillis() - nowTimeHash));
        System.out.println("Index1:" + answerArrayHash[0]);
        System.out.println("Index2:" + answerArrayHash[1]);
    }
}
相關文章
相關標籤/搜索