演算法訓練營第10天,中間因為身體原因落了兩天進度,有點趕不上,但也不能著急,該學的還是得先掌握好才可以,(-_-|||)
1.力扣242
這是我第一次利用哈希表做題,學校教的僅僅是理論知識,只知哈希不知道怎么用,現在才理解它的妙用,
本題用陣列作為一個哈希表,首先存盤資料,之后用待測驗資料進行洗掉操作,如果表中的資料為0,說明資料都被取走(即符合要求),反之,若是正數或負數說明兩組字串中一定其中一方多或是少了字符,很巧妙的思想,關鍵部分在這里:

挺簡單的一道題,
2.力扣349
緊承242的陣列哈希,接下來是set的應用,本題主要使用unorder_set,其底層也是哈希,哈希一般用于快速判斷某個數是否在集合中,這道題要求交集并且元素唯一,很自然的就能夠想到利用哈希來解決問題,
二者區別在于,陣列面對分散且跨度大的資料非常浪費空間,它需要申請一系列連續的記憶體地址,而unordered_set則解決了這個問題,雖然這道題限制了數量可以用陣列哈希,但母庸置疑,unordered_set是主要考察的知識,
在做題程序中我并不是很理解for(:)的用法,以及為何find函式‘’!=‘’就能夠判斷是否查找成功(不應該是==嗎),通過翻閱primer和查找博客我找到了如下的知識:


現在貼上源代碼:

現在就很容易理解為什么這里會這樣做了,它利用了c++11的新特性,也算是又學到了一點東西吧(笑),
3.不快樂的快樂數
每每遇到這種類似數學想法的題目我都會想:他們到底腦子里都在想些什么怪東西!
第一次讀題似懂非懂,知道要求出各位數的平方后便束手無策,看了卡哥題解才發現無限回圈是關鍵,將所有求和的值存盤到哈希表中,一旦有回圈的可能便及時終止,反之持續到和為1,當然,因為數量較大,依然使用unordered_set,
求位數的操作算是繞了點腦彎,不理解的話舉個例子也能得出,首先是個位,之后繼續向上:

理解思路后也不是那么不快樂了呢!
4.新手勸退第一題再戰!
啊,兩數之和,一開始就把我拿捏的死死的,用了暴力解法看不懂哈希的我,今天打敗你了!
這道題不僅要知道元素是否遍歷過,還得知道這個元素對應的下標,綜合思考,map是最合適的選擇,
map是另一種資料結構,我理解為python中的鍵值對,因為這道題也涉及判斷原宿是否在資料中,所以利用哈希的map比較合適,unordered_map又是新的一個知識點,
首先是定義:std::unordered_map <int,int> map;類似set的定義方式,只不過鍵值對需要兩個初始化,
接下來是思考如何繼續,我們可以在遍歷一個元素時把它存入哈希表中,在遍歷下一個元素時判斷現在哈希表中的數和現在正在遍歷的數是否符合條件,我們要確定鍵是誰,值是誰,這取決于題目要求我們回傳什么東西,在這里遍歷的元素是鍵,值是下標,
主要部分在這:

OK,到 iter->second 我又不理解了,這是什么登西,通過primer我又看到了這些:(primer真是圣經啊!!)

下面又給出了更明白的例子:

現在一切都清楚多了,
我發現我慢慢有了思路,寫代碼時知道哪個要在這里,哈希明顯感覺要比之前寫的順利多,雖然定義這里還不是很熟,但相比以前,我確實好的太多了,
加油!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/548174.html
標籤:其他
上一篇:瀏覽器特性與安全策略
