1. 程式人生 > >【LeetCode】兩數之和

【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