最近為了準備春招又開始做LeetCode了趴荸,先上一年前做題時的提交記錄:
可見當時應(yīng)該是第一次刷題,一開始應(yīng)該是用兩層for循環(huán)做的,能通過送浊,但是時間復(fù)雜度是O(N^2),估計是后來偷看了答案丘跌,發(fā)現(xiàn)比較好的做法是用哈希表袭景,于是記憶著評論著別人的代碼稀里糊涂的就以O(shè)(N)的時間復(fù)雜度通過了。闭树。耸棒。。(估計那個時候還內(nèi)心狂喜报辱,裝逼地在心里說著學(xué)到了學(xué)到了与殃,想著自己又變強了呀。碍现。幅疼。囧)
于是今天分類復(fù)習(xí)哈希表這塊挑了幾道題做的時候又遇到了這一題,于是憑著自己“優(yōu)秀”的記憶力昼接,寫出了如下的代碼:
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
numIndexDict = {}
for index, num in enumerate(nums):
numIndexDict[num] = index
for num in nums:
if target - num in nums and numIndexDict[num] != numIndexDict[target - num]:
return [numIndexDict[num], numIndexDict[target - num]]
return []
內(nèi)心OS: “這題不是很簡單嘛爽篷,先把數(shù)組所有的元素作為字典的key,下標作為value辩棒,這樣等下面判斷if target - num in nums
的時候就可以把對應(yīng)的下標輸出了呀狼忱,嘿嘿嘿,so easy一睁∽昱”
然而,現(xiàn)實是殘酷的者吁,力扣給出的評分結(jié)果是:解答錯誤>桨场!复凳!
看到給出的輸入[3, 3]的時候我就明白了瘤泪,我這種先把數(shù)組遍歷一遍把對應(yīng)的值和下標作為key和value存到字典里其實相當于set()了一下,把不同下標但是值相同的元素去重了(這樣其實會導(dǎo)致target = 6, 數(shù)組中有兩個3的時候育八,其實應(yīng)該返回這兩個元素對應(yīng)的下標对途,但是因為在我建哈希表的時候,這兩個元素已經(jīng)被我在哈希表中“變成一個元素了”髓棋,也就是我寫的這句判斷代碼
if target - num in nums and numIndexDict[num] != numIndexDict[target - num]:
return [numIndexDict[num], numIndexDict[target - num]]
是進不來的实檀,最終肯定走到return []去了惶洲。。)
那如何避免我的這種情況呢膳犹?(當然大佬們是不會犯我這種錯誤的恬吕。。须床。)铐料。 其實可以從前往后依次遍歷數(shù)組的時候,判斷target - num是否在我們的哈希表中( 剛剛自己寫代碼的時候突然對于符合判斷元素是否在哈希表中糾結(jié)是否能否通過 key in dict的方式來判斷豺旬,查了一下钠惩,網(wǎng)上是這么說的(Python 字典 in 操作符用于判斷鍵是否存在于字典中,如果鍵在字典 dict 里返回 true哈垢,否則返回 false妻柒。)扛拨,所以還是要自己真的去動手寫耘分,去思考啊。绑警。求泰。),如果不在的話计盒,就把(元素渴频,下標)作為(key, value)存到自己建的字典中。如果在的話北启,就可以 return 哈希表中對應(yīng)元素的value了卜朗。 大致可以寫出如下代碼:
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
indexNumDict = {}
for index, num in enumerate(nums):
if target - num in indexNumDict:
return index, indexNumDict[target - num]
indexNumDict[num] = index
return []
這樣其實可以避免我上面出現(xiàn)的問題。比如還是數(shù)組 = [3, 3]咕村,target = 6的時候场钉,第一次判斷target - 3在不在哈希表中,結(jié)果是不在的懈涛,然后存入哈希表逛万。第二次判斷target - 第二個3的時候查詢哈希表,發(fā)現(xiàn) target - 3 = 3這個key已經(jīng)在哈希表中了批钠,所以果斷 return index, indexNumDict[target - num]
宇植。
就這一題其實可以反映我自身的問題,我從初中的時候其實就養(yǎng)成了一個很不好的習(xí)慣埋心,在面臨考試這樣的任務(wù)指郁,或者一味追求數(shù)量的時候,我會嘗試著用大腦去記住所有的解法拷呆,這種方法也許在邏輯簡單闲坎,知識簡單的情況下可以記住90%甚至更高的解題方法,但是這種方式也在扼殺自己養(yǎng)成真正去思考知識背后的邏輯,也就是真正的理解箫柳,到高中之后知識變得龐雜手形,變得更有深度的時候,記憶程度有限的大腦只會變得疲憊悯恍,并且失去思考的真正樂趣库糠。。 所以正如前幾天我問實習(xí)的一個小伙伴說我做題之后就都忘了他給我的建議——“刷題的時候至少要有連續(xù)的投入三小時以上涮毫,有時候一上午做一兩道題都是很正常的瞬欧,要去理解,而不是記憶”罢防。單純的記憶不理解也許短期內(nèi)能記住艘虎,但是理解了之后才是 long-term memory,才能體會到思考的樂趣咒吐,形成正向激勵野建,這才是正道(當然如果都到面試前幾天了,那就背吧恬叹!??????)候生。