1.兩數之和_簡單_20210122
阿新 • • 發佈:2021-01-23
目錄
1.兩數之和
1.1.題目描述
- 給定一個整數陣列
nums
和一個整數目標值target
,請你在該陣列中找出和為目標值的那兩個整數,並返回它們的陣列下標。- 你可以假設每種輸入只會對應一個答案。但是,陣列中同一個元素不能使用兩遍。
1.2.解法一:暴力迴圈
- 兩重迴圈,遍歷所有情況看相加是否等於目標和。
- 時間複雜度:兩層 for 迴圈,O(n²)
- 空間複雜度:O(1)
public int[] twoSum(int[] nums, int target) { int[] ans=new int[2]; for(int i=0;i<nums.length;i++){ for(int j=(i+1);j<nums.length;j++){ if(nums[i]+nums[j]==target){ ans[0]=i; ans[1]=j; } } } return ans; }
1.3.解法二:雜湊表
- 使用Map集合以鍵值對形式儲存陣列元素及對應下標
- 檢視Map中是否存在(target-nums[i])的鍵,還需判斷找到的元素不是當前元素,因為題目裡講一個元素只能用一次。
- 時間複雜度:比解法一少了一個 for 迴圈,降為 O(n)
- 空間複雜度:空間換時間, 開闢了一個雜湊表,空間複雜度變為 O(n)
public int[] twoSum(int[] nums, int target) { Map<Integer,Integer> map=new HashMap<>(); for(int i=0;i<nums.length;i++){ map.put(nums[i],i); } for(int i=0;i<nums.length;i++){ int sub=target-nums[i]; if(map.containsKey(sub)&&map.get(sub)!=i){ return new int[]{i,map.get(sub)}; } } throw new IllegalArgumentException("No two sum solution"); }