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中.
移到下一個元素, x = 2,彌補target - x = 7, 在check中也沒有找到key為7的元素,和上一步一樣,將key = 2, value = 1存入check中.
移到下一個元素, x = 7, 目標target - x = 2,在check中找到了key為2的資料,此時當前 x = 7的位置為2,check中key為2對應的value為1, 也就是說次陣列第1專案和第2項所對應的值之和為target
程式碼實現
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;
}
複製程式碼
相關程式碼歡迎大家關注並提出改進的建議