leetcode-1.two sum(兩數之和)
阿新 • • 發佈:2018-12-31
前言:
元旦放假實在無聊,寫點程式碼娛樂自己吧,平時工作負責專案管理方面的東西相對多了一些,作為一個熱愛程式設計的人實在是手癢,趁著假期練練手,當然了,不是為了刷題,就是為了讓自己保持一個程式設計的狀態。個人覺得為了刷題而刷題會失去很多寫程式碼的樂趣,由於自己水平有限,如果程式碼有問題或者有什麼更好的辦法也歡迎各位大神提意見,感謝。
題目來源: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),結果如下: