內容目錄
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)提交結果
思考總結
根據這題的兩種解法就可以看出,不同的算法會有不同的效率,所以我們在編程的時候,不要僅僅局限於解出這個題目,而是要在解決問題的基礎上想辦法去優化你的算法,使之效率更高。