python leetcode_七十五、Python | Leetcode哈希表系列
@Author:Runsen
@Date:2020/7/3
人生最重要的不是所站的位置,而是內心所朝的方向。只要我在每篇博文中寫得自己體會,修煉身心;在每天的不斷重復學習中,耐住寂寞,練就真功,不畏艱難,奮勇前行,不忘初心,砥礪前行,人生定會有所收獲,不留遺憾 (作者:Runsen )
作者介紹:Runsen目前大三下學期,專業化學工程與工藝,大學沉迷日語,Python, Java和一系列數據分析軟件。導致翹課嚴重,專業排名中下。.在大學60%的時間,都在CSDN。決定今天比昨天要更加努力。 前面文章,點擊下面鏈接
我的Python教程,不斷整理,反復學習
今日,我決定繼續更新Python教程,今天就開始了七十五、Python | Leetcode哈希表系列。
哈希表
哈希表(散列表)的思想是將關鍵字 Key 映射到存放記錄的散列表中從而進行快速訪問,其中映射函數 f(key) 稱為哈希函數(散列函數),依據哈希函數建立的查找表稱為哈希表。
Hash,音譯為哈希,是把任意長度的輸入(又叫做預映射pre-image)通過散列算法變換成固定長度的輸出,該輸出就是散列值。這種轉換是一種壓縮映射,也就是,散列值的空間通常遠小于輸入的空間,不同的輸入可能會散列成相同的輸出,所以不可能從散列值來確定唯一的輸入值。簡單的說就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數。
假如班級里面有50個學生,都有各自的名字,我們想把學生的名字放在一個表上,同時便于很快的查找,你會毫無想到數組,但是查找的復雜度是O(n),所以哈希表就是為了解決這問題,將查找的復雜度達到 O(1)
假如有個學生的名字叫做lies,通過hash函數,得到下標9 ,將lies的ASCII碼加起來 429%30 =9 ,這樣的過程就是hash函數。
但是又沒有可能出現hash碰撞,就是出現了一樣的hash值,當然有可能
假如有個人的名字叫做foes,那么如何查找呢?當然是將數據儲存成鏈表,用鏈表的方式來查找。
其實,哈希表就是一個具備映射關系的表,我們可以通過映射關系由鍵找到值。下面是一個簡單的哈希表:
class?Map:????def?__init__(self):????????self.items?=[None]*100????def?hash(self,a):????????return?a*1+0????def?put(self,k,v):????????self.items[hash(k)]?=?v????def?get(self,k):????????hashcode=hash(k)????????return?self.items[hashcode]這個哈希函數十分簡單,但簡單不妨礙它成為一個哈希函數,事實上,它叫直接定址法,是一個線性函數:
直接定址法的優點很明顯,就是它不會產生重復的hash值。但由于它與鍵值本身有關系,所以當鍵值分布很散的時候,會浪費大量的存儲空間。所以一般是不會用到直接定址法的。
LeetCode 第 136題:只出現一次的數字
#給定一個非空整數數組,除了某個元素只出現一次以外,其余每個元素均出現兩次。找出那個只出現了一次的元素。?#?說明:?#?你的算法應該具有線性時間復雜度。?你可以不使用額外空間來實現嗎??#?示例?1:?#?輸入:?[2,2,1]#輸出:?1#?示例?2:?#?輸入:?[4,1,2,1,2]#輸出:?4?#?Related?Topics?位運算?哈希表下面一行代碼不做解釋。
class?Solution:????def?singleNumber(self,?nums:?List[int])?->?int:????????return?sum(set(nums))*2-sum(nums)一遍遍歷,用哈希表計數;再遍歷,返回個數是1的數。{}用于創建空字典,空集合用set() dict的.get(a,b)中取出字典中鍵為a的值,如果不存在這樣的鍵,則返回b。
class?Solution:????def?singleNumber(self,?nums:?List[int])?->?int:????????dic?=?{}????????for?i?in?nums:????????????dic[i]?=?dic.get(i,0)+1????????????????????for?i?in?nums:????????????if?dic.get(i)==1:????????????????return?iLeetCode 第 217題:存在重復元素
#給定一個整數數組,判斷是否存在重復元素。?#?如果任意一值在數組中出現至少兩次,函數返回?true?。如果數組中每個元素都不相同,則返回?false?。?#?示例?1:?#?輸入:?[1,2,3,1]#輸出:?true?#?示例?2:?#?輸入:?[1,2,3,4]#輸出:?false?#?示例?3:?#?輸入:?[1,1,1,3,3,4,3,2,4,2]#輸出:?true?#?Related?Topics?數組?哈希表下面代碼不解釋
class?Solution:????def?containsDuplicate(self,?nums:?List[int])?->?bool:????????if?len(set(nums))?==?len(nums):????????????return?False????????else:?????????????return?True初試化哈希表dic = {}。遍歷數組:若i不在hash中,則令dic[i] = 1為key,1為value(隨便什么都可以)。若已存在,則返回True。
class?Solution:????def?containsDuplicate(self,?nums:?List[int])?->?bool:????????dic?=?{}????????for?i?in?nums:????????????if?dic.get(i):????????????????return?True????????????dic[i]?=?1????????return?False劍指 Offer 50. 第一個只出現一次的字符
#在字符串?s?中找出第一個只出現一次的字符。如果沒有,返回一個單空格。?s?只包含小寫字母。?#?示例:?#?s?=?"abaccdeff"#返回?"b"#s?=?""?#返回?"?"#?限制:?#?0?<=?s?的長度?<=?50000?#?Related?Topics?哈希表遍歷字符串 s ,使用哈希表統計 “各字符數量是否 > 1 ”。 再遍歷字符串 s ,在哈希表中找到首個 “數量為 1的字符”,并返回。
class?Solution:????def?firstUniqChar(self,?s:?str)?->?str:????????dicts={}????????for?i?in?s:????????????dicts[i]=dicts.get(i,0)+1????????for?i?in?s:????????????if?dicts[i]==1:????????????????return?i????????return?'?'總結
以上是生活随笔為你收集整理的python leetcode_七十五、Python | Leetcode哈希表系列的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 联想天津工厂落成 未来年产300万电脑及
- 下一篇: websocket python爬虫_p