深知程序員和碼農的區別在於數據結構與算法,因此,我要開始刷Leetcode題目的道路,嘻嘻css
給定一個整數數組,返回兩個數字的索引,使它們相加到特定目標。
您能夠假設每一個輸入只有一個解決方案,而且您可能不會兩次使用相同的元素。
給定nums = [2,7,11,15],target = 9,
由於nums [ 0 ] + nums [ 1 ] = 2 + 7 = 9,
返回[ 0,1 ]。程序員
暴力破解,兩次循環遍歷將數組中的數分別相加等於target,再返回索引算法
class Solution { public int[] twoSum(int[] nums, int target) { int[] arrs=new int[2]; ; int sum=0; for (int i = 0; i <nums.length; i++) { for (int j = 0; j <nums.length&&i!=j ; j++) { sum=nums[i]+nums[j]; if(target==sum){ arrs[0]=i; arrs[1]=j; } } } return arrs; } }
執行用時 :95 ms, 在全部Java提交中擊敗了8.21% 的用戶
內存消耗 :37.2 MB, 在全部Java提交中擊敗了90.74%的用戶
用時過長,典型的時間換空間的作法數組
暴力破解的算法複雜度是O(n2),嘗試使用O(n),那麼意味着只能遍歷一次數字,那另外一個數字?
咱們須要將另外一個數字放至HashMap,來創建數字與座標位置之間的映射,HashMap是常數級的查找效率數據結構
int[] arrs=new int[2]; ; int sum=0; HashMap<Integer,Integer> hashMap=new HashMap<>(); for (int i = 0; i <nums.length; i++) { hashMap.put(nums[i],i); } for (int i = 0; i <nums.length; i++) { int num=target-nums[i]; if(hashMap.containsKey(num)&&hashMap.get(num)!=i){ arrs[0]=i; arrs[1]=hashMap.get(num); break; } } return arrs;
將解法二的兩個循環放在一個for循環中spa
int[] arrs=new int[2]; ; HashMap<Integer,Integer> hashMap=new HashMap<>(); for (int i = 0; i <nums.length; i++) { int num=target-nums[i]; if(hashMap.containsKey(target-nums[i])){ arrs[0]=i; arrs[1]=hashMap.get(target-nums[i]); break; } hashMap.put(nums[i],i); } return arrs;