【LeetCode】兩數之和
內容目錄
LeetCode第一題:兩數之和
題目描述題目分析題目解答思路一:雙重for迴圈(1)程式碼(2)提交結果思路二:hashmap鍵值對一次遍歷(1)程式碼(2)提交結果思考總結
LeetCode第一題:兩數之和
題目描述
給定一個整數陣列 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
題目分析
這一題我想大部分人第一思路應該都是雙重for迴圈來遍歷陣列。這也是我的第一思路,遍歷兩次陣列,當外迴圈下標和內迴圈下標對應的兩個數相加為target時,退出迴圈。這時候我們就找出了這兩個數,但我們需要考慮到題目條件不能重複利用陣列中同樣的元素
。
其實我看到這個條件的時候想了半天,
這個條件的意思是:兩個資料的值不能相同
例如:nums =[1,2,2,3] target = 4
只能返回 [0,3] 而不是 [1,2]
還是:兩個資料的下標不能相同
例如:nums =[1,2,3] target = 4
只能返回 [0,2] 而不是 [1,1]
又或者兩者都有(好像有點鑽牛角尖)
題目解答
思路一:雙重for迴圈
時間複雜度:O(n^2)
(1)程式碼
1 class Solution { 2 public int[] twoSum(int[] nums, int target) { 3 int length = nums.length; 4 for (int i = 0; i < length; i++) { 5 for (int j = 0; j < length; j++) { 6 //這裡把條件當做不能使用相同的下標元素 7 if (j != i && nums[i]+nums[j] == target) 8 return new int[]{i,j}; 9 } 10 } 11 return new int[]{}; 12 } 13 }
(2)提交結果
思路二:hashmap鍵值對一次遍歷
將nums[i]作為key,i作為value。
hashmap搜尋演算法時間複雜度為O(1)
整個演算法在最壞的情況下將陣列nums中所有值遍歷完也就是O(n)
所以這種解法的時間複雜度:O(n)
(1)程式碼
1 class Solution { 2 public int[] twoSum(int[] nums, int target) { 3 int length = nums.length; 4 HashMap<Integer,Integer> hashMap = new HashMap(); 5 for (int i = 0; i < length; i++) 6 //如果hashmap中有這個key則直接返回 7 //如果沒有,則存入hashmap之中 8 if (hashMap.containsKey(target - nums[i])) 9 return new int[]{i,hashMap.get(target-nums[i])}; 10 else 11 hashMap.put(nums[i],i); 12 return new int[]{}; 13 } 14 }
(2)提交結果
思考總結
根據這題的兩種解法就可以看出,不同的演算法會有不同的效率,所以我們在程式設計的時候,不要僅僅侷限於解出這個題目,而是要在解決問題的基礎上想辦法去優化你的演算法,使之效率更高。
&n