LeetCode_1——兩數之和(Two sum)

深知程序員和碼農的區別在於數據結構與算法,因此,我要開始刷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是常數級的查找效率數據結構

步驟

  1. 將全部的數組存放至HashMap中
  2. 遍歷數組,將target-nums[i],就能夠獲得另外一個目標數
  3. 查詢HashMap中是否含有此目標數
  4. 查詢成功,則返回結果
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;

結果

  執行用時 :7 ms, 在全部Java提交中擊敗了88.43% 的用戶
  內存消耗 :38.9 MB, 在全部Java提交中擊敗了51.18%的用戶

解法三

思想

  將解法二的兩個循環放在一個for循環中spa

步驟

  1. 經過target-nums[i]獲取目標數
  2. 查詢HashMap中是否含有此目標數
  3. 有則返回兩個目標數,無則將nums[i]存放至HashMap中
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;

結果

  執行用時 :6 ms, 在全部Java提交中擊敗了94.30% 的用戶
  內存消耗 :38.9 MB, 在全部Java提交中擊敗了51.36%的用戶
相關文章
相關標籤/搜索