【LeetCode笔记】1. 两数之和(JAVA、哈希表)
生活随笔
收集整理的這篇文章主要介紹了
【LeetCode笔记】1. 两数之和(JAVA、哈希表)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 一. 題目描述
- 二. 解法
- ① 暴力破解
- ② 靜態哈希表
- 1. 為什么用哈希表來做
- 2. 特殊情況:兩數相同,map映射覆蓋
- ③ 動態哈希表
- ④ 未解之謎
誒嘿,經典開頭題目
一. 題目描述
數組中同一個元素不能使用兩遍:
- 見實例2,實際過程可能出現輸出為[0,0]的情況,就是同一元素使用了兩遍,要注意判斷
二. 解法
① 暴力破解
看到題干,首選暴力。
只需要遍歷數組:對于數組中的每一個元素,都和后面的所有元素進行一次匹配即可。
- 時間復雜度為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)
- 目前了解的最好的方法
- 在②的基礎上,會比較好理解
- 在②之上的優化:
比如實例3,先存儲<3,0>映射;到nums[1]的時候,不需要覆蓋<3,1>映射,而是滿足if判斷,直接返回[0,1]。
④ 未解之謎
這一塊是無傷大雅,但是想弄明白的地方
= =這個解決了,應該把nums改成nums.length,還是用得不夠熟悉。
總結
以上是生活随笔為你收集整理的【LeetCode笔记】1. 两数之和(JAVA、哈希表)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java计算器 运算符优先级_跪求大神帮
- 下一篇: 【学习笔记】网络层——网络层设备、移动I