題目
https://leetcode-cn.com/problems/two-sum/submissions/java
公衆號 《java編程手記》記錄JAVA學習平常,分享學習路上點點滴滴,從入門到放棄,歡迎關注編程
描述
給定一個整數數組 nums
和一個整數目標值 target
,請你在該數組中找出 和爲目標值 的那 兩個 整數,並返回它們的數組下標。數組
你能夠假設每種輸入只會對應一個答案。可是,數組中同一個元素在答案裏不能重複出現。學習
你能夠按任意順序返回答案。url
示例 1:.net
輸入:nums = [2,7,11,15], target = 9
輸出:[0,1] 解釋:由於 nums[0] + nums[1] == 9 ,返回 [0, 1] 。 示例 2:code
輸入:nums = [3,2,4], target = 6
輸出:[1,2] 示例 3:索引
輸入:nums = [3,3], target = 6
輸出:[0,1]內存
Solution
數組nums中存在兩個下標
的值相加的和等於target
目標值,找到這兩個數字並返回下標
,而且答案中不能出現相同的元素座標,即每一個元素下標不能重複leetcode
暴力解法
暴力解法
思路
暴力解法,直接雙重for循環,循環不重複,第一層for循環從0
到(length-1)
,第二層for循環從第一層定義的開始+1
到length
,取出第一層循環的值和第二層循環的值,相加等於target
則記錄下標並返回
CODE
class Solution { public int[] twoSum(int[] nums, int target) { int[] ints = new int[2]; int length = nums.length; for(int i = 0 ; i <length-1 ; i++){ int a = nums[i]; for(int j = i+1 ; j <length ; j++){ int b = nums[j]; if(a+b==target){ ints[0] = i; ints[1] = j; return ints; } } } return ints; } }
複雜度
- 時間複雜度:
O(N^2)
,其中N
是數組中的元素數量。最壞狀況下數組中任意兩個數都要被匹配一次 - 空間複雜度:O(1)
結果
執行用時:0
ms, 在全部 Java
提交中擊敗了100.00%
的用戶
內存消耗:38.7
MB, 在全部 Java
提交中擊敗了35.39%
的用戶
哈希表
哈希表
思路
暴力解法的弊端在於x + y == target
的時間複雜度太高,咱們須要快速找到x對應的y
(target-x
)是否存在,即快速找到對應的索引,哈希表則是一個很好的選擇,利用哈希表將當前值x
以及對應下標i
存儲起來,對於遍歷的每一個x
,先查詢在哈希表中是否有對應的y
(target-x
),沒有則將x
存入到哈希表中,保證x
不會和本身匹配
CODE
class Solution { public int[] twoSum(int[] nums, int target) { Map<Integer, Integer> hashtable = new HashMap<Integer, Integer>(); for (int i = 0; i < nums.length; ++i) { //首先檢查哈希表中是否有對應的y(target-x) if (hashtable.containsKey(target - nums[i])) { return new int[]{hashtable.get(target - nums[i]), i}; } //存儲當前值和對應下標 hashtable.put(nums[i], i); } return new int[0]; } }
複雜度
-
時間複雜度:
O(N)
,其中N
是數組中的元素數量。對於每個元素x
,咱們能夠O(1)
地尋找target - x
-
空間複雜度:
O(N)
,其中N
是數組中的元素數量。主要爲哈希表的開銷
結果
執行用時:0
ms, 在全部 Java
提交中擊敗了100.00%
的用戶
內存消耗:38.7
MB, 在全部 Java
提交中擊敗了47.28%
的用戶