leetcode第一題,兩數之和(Two Sum),JavaScript實現

   本博客的做者與csdn裏 Tank_in_the_street的做者是同一做者,轉載文章需寫明出處,謝謝合做。

       好好學習,每天向上。不會算法和數據結構的前端不是一個好前端,爲了可以讓本身的能力獲得更多的提高,小弟開始入坑了leetcode的刷題之旅,爲往後升職加薪或者跳槽提供更多的能力基礎。前端

閒話少說,開始leetcode的第一題,在講第一題以前,先了解一下該題。算法

       該題的題目描述是在一個數組裏尋找兩個數,若是兩個數加起來等於目標值的話則返回他們的下標。這裏有個前提就是這兩個數的下標是不能相同的。瞭解到這一點後可能不少同窗都想到一種解法就是用雙重for循環暴力解。可是這種方法犧牲時間來解題,時間複雜度爲n的平方,我的以爲既然都作算法題了確定是要對時間進行優化。因此個人第一種作法是將數組中的value值傳入一個對象裏做爲該對象的屬性,而該對象對應屬性的屬性值則是與數組的value對應的下標index值。以後遍歷數組,當目標值(target)減當前數組的value值獲得的新值在對象中存在而且當前下標不等於該新值所在對象的屬性值時則肯定找到了這兩個下標。關鍵代碼以下:數組

       最終得出來的結果是時間複雜度是n,然而這道題經過以後我在想,好像這道題我犧牲了一點空間來換取時間的最優化,那麼有沒有方法在不太犧牲空間的狀況下時間也能夠最優化呢。看了一下leetCode裏面的最快方法,其中運行時間56ms的代碼是這樣子的:數據結構

       然而這種作法是犧牲時間來換取空間,if判斷裏的in實際上是JavaScript引擎裏對對象進行了一次遍歷,因此我以爲該方法實際上的時間複雜度其實也是n的平方,而且本身也運行了一遍結果是這樣的:學習

       卻是後面60ms那個纔是真正意義上的在不犧牲空間、用一層for循環下達到算法的最優化:優化

       本身運行了一遍的確是比我如今的算法在空間上更加的優化:.net

       而後我思考了一下這個算法,這個算法的判斷比我少判斷了一個當前下標是否重複,緣由是他的對象屬性都是每次遍歷最後才添加,而不是像我那樣先一個for循環儲存全部obj的屬性值。這個方法的優勢在於for循環最壞狀況下是遍歷完,最好的狀況是第二次遍歷就能夠跳出循環,obj裏不會存有太多屬性。而個人因爲一開始就爲obj存入全部的屬性,因此無論我這個循環最好仍是最壞狀況都比他多遍歷一個數組。因爲個人對象裏有全部的屬性值,因此還須要判斷一次當前下標是否重複。code

相關文章
相關標籤/搜索