兩數之和(TwoSum)

Aquan發表於2019-12-19

大家都說 演算法 是程式設計師的分水嶺, 三年 技術一個坎。

我工作2年已經感覺到危機感,正準備同時這面臨著兩個問題了,不如蹭現在還有來得及一起去把演算法練起來吧,光看可不行得練。儘可能的把 https://leetcode-cn.com/ Leetcode 力扣 中的演算法題都刷一遍。

遵循:先用自己的可以實現的方法做,做出來後,在看看大佬們的效能解法學習學習。 (連自己的方法都做不出來,只能偷偷的看看答案了xixixi~,不管是白貓黑貓抓到老鼠就是好貓,先要求自己做對,再最求效能)

我也會把 Leetcode 力扣 上做的題目程式碼,放在 GitHub 上進行同步,方便大家查閱程式碼,給出你的 Pr 和提出 issues

GitHub: https://github.com/aquanlerou/leetcode

兩數之和(TwoSum)

首先我們先看看題目描述:

給定一個整數陣列 nums 和一個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。

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

示例:

給定 nums = [2, 7, 11, 15], target = 9因為 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]

來源:力扣(LeetCode)

連結:https://leetcode-cn.com/problems/two-sum

著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

我第一時間看到題目後想法,逐個逐個迴圈nums[]相加得出結果後,判斷結果是否與 target 相等,相等後就跳出迴圈,這個估計是最笨的辦法了。

  • 遍歷陣列兩兩相加得出結果

  • 迴圈中判斷是否與目標數相等

    • 相等跳出迴圈,記錄數值的位置
    • 不相等繼續迴圈相加
  • 最後把記錄的數值return返回

上程式碼:

public int[] twoSum(int[] nums, int target) {    
    int n = nums.length;    
    int a = 0;    
    int b = 0;    
    for(int i=0 ; i <=n; i++) {        
        for(int j=i+1; j<n; j++) {            
            int result = nums[i] + nums[j];            
            if(result == target) {                
                a = i;                
                b = j;            
            }        
        }    
    }    
    int[] resultArray = new int[]{a, b};    
    return resultArray;
}

這種解法,估計就是速度慢和效能上消耗大了。這裡我還無法用什麼 時間複雜度空間複雜度 去評論,因為我不懂 doge-,-,下面得好好了解下才行了。

Dalao 解法

參考:https://leetcode-cn.com/problems/two-sum/s...

看完解法後,瞭解到是利用到了HashMap中的containsKey方法查詢MapKey降低耗時。

  • 迴圈遍歷

    • nums[]中的值已Key形式,和對應值的nums[]的下標已value形式存進Map
    • 迴圈中進行target - nums[i]計算
    • 計算結果通過containsKey方法在Map中查詢是否有對應值
    • 有的話就返回map.get(target - nums[i])和迴圈的次數i
    • 我們最後還是得考慮下要是陣列中沒有對應的結果應該怎麼處理,這個時候我們返回-1,-1

程式碼:

public int[] twoSumHash(int[] nums, int target) {    
    Map<Integer, Integer> map = new HashMap<>();    
    for (int i=0; i<nums.length; i++) {        
        int result = target - nums[i];        
        if (map.containsKey(result)) {            
            return new int[] {map.get(result), i};        
        }        
        map.put(nums[i], i);    
    }
    return new int[] {-1, -1};
}

最後希望大家可以理解得了,可能會描述的不清楚。

長按關注喔~

本作品採用《CC 協議》,轉載必須註明作者和本文連結

愛敲程式碼的貓

相關文章