LeetCode: Two sum(兩數之和)

gengzhibo發表於2019-01-08

LeetCode: Two sum(兩數之和)

日常新坑,沉迷學習,無法自拔

自己實現的程式碼,在可解讀的前提下盡力優化.

歡迎訪問我的個人網站訪問此文章

LeetCode:https://leetcode.com/problems/two-sum/

LeetCodeCn: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]

解題方法

暴力列舉

遍歷nums中的每個元素x,查詢是否存在target-x的元素

雜湊表輔助(一次遍歷)

簡單來說就是在遍歷的時候將遍歷過的x存入HashMap中,已x的值為key,x所在的位置為vaue.在遍歷新的元素的時候檢查target-x所對應的元素是否包含在HashMap中,如果存在的話就能直接獲取到當前x的位置和target-x的位置.

圖解相關思路

以下是個測試用例,現在[1,2,7,11,15]的陣列中尋找其中哪兩個元素和為9.

輸入條件

根據思路,我們開始遍歷此陣列

當x = 0時候, 目標target - x = 8, 我們在check中查詢是否存在key為8的元素. 此時我們發現沒有key為8的元素,將key = 1,value = 0存入check的HashMap中.

i=0

移到下一個元素, x = 2,彌補target - x = 7, 在check中也沒有找到key為7的元素,和上一步一樣,將key = 2, value = 1存入check中.

i=1

移到下一個元素, x = 7, 目標target - x = 2,在check中找到了key為2的資料,此時當前 x = 7的位置為2,check中key為2對應的value為1, 也就是說次陣列第1專案和第2項所對應的值之和為target

i=2

程式碼實現

public int[] twoSum(int[] nums, int target) {
    HashMap<Integer, Integer> check = new HashMap<>();
    int[] position = new int[2];
    for (int i = 0; i < nums.length; i++) {
        int index = target - nums[i];
        if (check.containsKey(index)) {
            position[0] = check.get(index);
            position[1] = i;
            return position;
        } else {
            check.put(nums[i], i);
        }
    }
    return position;
}
複製程式碼

相關程式碼歡迎大家關注並提出改進的建議

相關文章