簡單演算法題-兩個數相加
阿新 • • 發佈:2018-11-11
簡單演算法題-兩個數相加
題目的大意大概是這個樣子的:
給定一個整數陣列和一個目標值,找出陣列中和為目標值的兩個數。
你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。
示例:
給定 nums = [2, 7, 11, 15], target = 9
因為 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
一開始的時候我想的就是這個題還不簡單 暴力麼.
外圈迴圈定住一個值 內圈迴圈暴力搜尋找到了就return
但是時間複雜度過高
先貼一下暴力的程式碼吧
for (int i = 0; i < nums.length; i++) { for (int j = i + 1; j < nums.length; j++) { if (nums[j] == target - nums[i]) { //target是目標值 return new int[] { i, j }; } } } return null;
時間複雜度為O(n^2) 空間複雜度O(1)
後來我發現有一個超級巧妙的辦法 就是用hash表
HashMap<Integer,Integer>();
我們可以讓Key 儲存 當前元素的值 value 儲存對應的陣列下標
每遍歷一個先看一下 target(目標值) - nums[i] 存不存在這個鍵
如果存在這個鍵 返回這個鍵所對應的value 和 i就可以
如果不存在 那麼我們就存到HashMap裡
這樣一遍遍歷就可以
public int[] twoSum(int[] nums, int target) { Map<Integer, Integer> map = new HashMap<>(); for (int i = 0; i < nums.length; i++) { int complement = target - nums[i]; if (map.containsKey(complement)) { return new int[] { map.get(complement), i }; } map.put(nums[i], i); } throw new IllegalArgumentException(); }
時間複雜度:O(n)
空間複雜度:O(n)