1. 程式人生 > >leetcode-1.two sum(兩數之和)

leetcode-1.two sum(兩數之和)

前言:

元旦放假實在無聊,寫點程式碼娛樂自己吧,平時工作負責專案管理方面的東西相對多了一些,作為一個熱愛程式設計的人實在是手癢,趁著假期練練手,當然了,不是為了刷題,就是為了讓自己保持一個程式設計的狀態。個人覺得為了刷題而刷題會失去很多寫程式碼的樂趣,由於自己水平有限,如果程式碼有問題或者有什麼更好的辦法也歡迎各位大神提意見,感謝。

題目來源:https://leetcode-cn.com/problems/two-sum/submissions/

正文:

給定一個整數陣列 nums 和一個目標值 target,請你在該陣列中找出和為目標值的那 兩個

 整數,並返回他們的陣列下標。

你可以假設每種輸入只會對應一個答案。但是,你不能重複利用這個陣列中同樣的元素。

示例:

給定 nums = [2, 7, 11, 15], target = 9

因為 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

1:第一次隨意寫寫,使用了最簡單的暴力窮舉法,程式碼如下:

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int[] targetNum = new int[2];
        for (int i = 0; i < nums.length; i++) {
            for (int k = i+1; k < nums.length ; k++) {
                if (nums[i] + nums[k] == target) {
                    targetNum[0] = i;
                    targetNum[1]=k;
                }
            }
        }
        return targetNum;
    }
}

該演算法的時間複雜度為O(n2),結果如下:

2.由於上面的演算法實在是太慢,自己優化了一下,大概想法是使用hash匹配,程式碼如下:

class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer, Integer> hashMap = new HashMap();
        //int record = 0;
        for (int i = 0; i < nums.length; i++) {
            hashMap.put(nums[i], i);
        }

        for (int j = 0; j< nums.length; j++) {
            int record = target - nums[j];
            Integer result = hashMap.get(record);
            if (result != null && result != j) {
                return new int[] { j, result };
            }
        }

        return null;
    }
}

該演算法的時間複雜度為O(n),結果如下: