從兩道亦可賽艇的演算法題看字典的神奇作用

字典是python中一種可變容器模型,可以存儲任意類型對象。

字典的每個鍵值(key=>value)對用冒號(:)分割,每個對之間用逗號(,)分割,整個字典包括在花括弧({})中。

在一些情況下,藉助字典可以顯著提高代碼的運行效率,在之前的一篇《從遞歸出發思考Google面試題另一種解法+24點遊戲》中,字典就起到了非常重要的作用,接下來,我們通過兩道亦可賽艇的演算法題目來說明:

Problem 1

題目來自Leetcode

Given an array of integers, return indices of the two numbers such that they add up to a specific target.

You may assume that each input would have exactly one solution, and you may not use the same element twice.

Example:

Given nums = [2, 7, 11, 15], target = 9,

Because nums[0] + nums[1] = 2 + 7 = 9,

return [0, 1].

通過Example可以很容易看出題目的意圖,最簡單粗暴的方法可以是這樣:

用IPYTHON NOTEBOOK測試結果如下:(python3.6)

但是仔細分析的話,這段代碼的運行效率並不高,對於n個數,需要兩個訓話,運算n(n-1)/2次,有沒有更快更巧妙的辦法呢?答案是肯定的,事實上,通過字典可以只需要一個循環m執行n次就可以完成。

思路如下:建立一個空字典,對於列表中的任意一個數num,如果它不在字典中,就將值i存入字典的鍵target-num ,如果它已經在字典中,說明找到了符合條件的組合,這樣只需要對列表循環一次。

代碼及測試結果如下:

Problem 2

這是一道作業題,具體出處不知道了

對於這道題目,最簡單的方法是通過兩個循環+if判斷,但不動腦的方法必然不是最高效的,如果通過字典,我們可以只用一個循環就解決問題,當然不排除通過其他數據結構可能會有更簡便的方法。

思路與上一道題目類似,就不細講了,直接上代碼和測試結果。

def crowded_cows(cowlist,k):n cowdict={}n cowdictnum = {}n maxid = -1n for i in range(len(cowlist)):n if cowdict.get(cowlist[i]) is None:n cowdict[cowlist[i]] = i n else:n if i - cowdict[cowlist[i]] <= k:n maxid = max(maxid,cowlist[i])n else:n cowdict[cowlist[i]] = i n return(maxid) n

測試結果

綜上,引入字典其實是一種典型的用空間換速度的策略,希望這兩道題目對讀者有所啟發,當然,如果文中有不當之處,或者有更好的方法,也歡迎指出。

作者:侯正平 Python愛好者社區專欄作者,請勿轉載,謝謝。

出處:從兩道亦可賽艇的演算法題看字典的神奇作用

配套視頻教程:Python3爬蟲三大案例實戰分享:貓眼電影、今日頭條街拍美圖、淘寶美食 Python3爬蟲三大案例實戰分享

公眾號:Python愛好者社區(微信ID:python_shequ),關注,查看更多連載內容。

加小編個人微信:tsdatajob ,跟作者互動,一起探討。

推薦閱讀:

BAT機器學習面試1000題系列(281-285)
萌新刷題(九)二叉查找樹迭代器
未來是屬於掌握演算法的公司

TAG:Python | 机器学习 | 算法 |