日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【LeetCode笔记】1. 两数之和(JAVA、哈希表)

發布時間:2024/7/23 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【LeetCode笔记】1. 两数之和(JAVA、哈希表) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 一. 題目描述
  • 二. 解法
      • ① 暴力破解
      • ② 靜態哈希表
          • 1. 為什么用哈希表來做
          • 2. 特殊情況:兩數相同,map映射覆蓋
      • ③ 動態哈希表
      • ④ 未解之謎

誒嘿,經典開頭題目

一. 題目描述

數組中同一個元素不能使用兩遍:

  • 見實例2,實際過程可能出現輸出為[0,0]的情況,就是同一元素使用了兩遍,要注意判斷

二. 解法

① 暴力破解

看到題干,首選暴力。
只需要遍歷數組:對于數組中的每一個元素,都和后面的所有元素進行一次匹配即可。

class Solution {public int[] twoSum(int[] nums, int target) {for(int i=0;;i++){for(int j=i+1;j<nums.length;j++){if(nums[i]+nums[j]==target)return new int[]{i,j};}}} }
  • 時間復雜度為O(n2n^2n2),空間復雜度為O(1)

現在題目解出來了,但是要怎么優化呢?
看到上述的時空復雜度,可以這么想:時間復雜度和空間復雜度不太均衡,可不可以試一下把時間上的負擔分一點到空間上呢?

② 靜態哈希表

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)hashtable.put(nums[i],i);// 再遍歷數組,結合哈希表進行查找for(int i=0;i<nums.length; ++i){if(hashtable.containsKey(target - nums[i])){// 這邊這個判斷不能少,否則出現同一元素使用兩次的情況if(hashtable.get(target - nums[i])!=i)return new int[]{hashtable.get(target - nums[i]),i};}}return new int[0];} }
  • 時間復雜度O(n),空間復雜度O(n)
1. 為什么用哈希表來做

暴力法的時間復雜度由來:n(遍歷數組元素)* n(查找能和當前數組組合成target的元素)。
而這個查找的O(n),如果是用哈希表來實現則是O(1)
而由于需要構建出哈希表,我們需要付出O(n)的空間復雜度代價。

2. 特殊情況:兩數相同,map映射覆蓋

描述:使用兩個數據值相同,下標不同的元素。而我們在建立映射表時使用的鍵值是數據值,因此下標大的元素會覆蓋之前的元素,變成新的映射,導致有些映射會丟失。

理解:考慮了好久。。。其實這樣子不會出問題

  • 首先保留的是下標大的元素的映射
  • 然后,我們在遍歷時使用的是數組,而且是先遇到下標小的元素。
    對這個小的元素進行哈希表查找,剛好可以找到下標大的元素。就可以得到正確的結果

③ 動態哈希表

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) {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),空間復雜度O(n)
  • 目前了解的最好的方法
  • 在②的基礎上,會比較好理解
  • 在②之上的優化
  • 不需要進行相同元素的判斷:當出現與之前值相同,并且可以組成target的值時,就直接滿足return條件了。
    比如實例3,先存儲<3,0>映射;到nums[1]的時候,不需要覆蓋<3,1>映射,而是滿足if判斷,直接返回[0,1]。
  • 占用的時間空間會更小:因為是一邊建哈希表一邊找answer的,所以很大概率在完全建表之前就找到answer。
  • ④ 未解之謎

    這一塊是無傷大雅,但是想弄明白的地方

  • 增強型for循環溢出
    = =這個解決了,應該把nums改成nums.length,還是用得不夠熟悉。
  • // 正常for循環,不會出錯 for(int i=0;i<nums.length; ++i)hashtable.put(nums[i],i); // 增強型for循環,會出現越界錯誤 for(int i : nums)hashtable.put(nums[i],i);
  • 需要額外寫return
  • // ②③如果只有if的return,編譯器會報錯:“missing return statement”,但是①卻不需要 return new int[0];

    總結

    以上是生活随笔為你收集整理的【LeetCode笔记】1. 两数之和(JAVA、哈希表)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。