問題:
判斷乙個鍊錶中是否有環。
分析:我們都知道,當乙個鍊錶中沒有環時,我們使用乙個指標能從頭遍歷到尾;當鍊表中有環時,鍊錶會在環中旋轉。
當我們使用兩個指標時【鍊錶操作的常用技巧!】,可以設定快、慢兩個指標。
如果鍊錶中不存在環,快指標肯定最終變為null;存在環的話,快指標和慢指標都會進入到環中,因為慢指標相對快指標靜止,快指標相對對慢指標步伐為1,最終快指標一定能趕上慢指標。
此方法時間複雜度為o(n),空間複雜度為o(1)
2)使用快、慢指標。
bool ishascycle(node* head) const問題:尋找乙個有環鏈表的第乙個入環節點。return
false
;}
分析:2)當我們使用快慢指標時,兩個節點會相遇。
假設直線階段長度為l,兩個指標的相遇點距環的起始點距離為t,這個環的長度為s。
我們讓慢指標從head處開始運動,每次向前走一步;快指標從head->next處開始運動,每次向前走兩步。
當兩個指標相遇時,快指標旋轉了m圈,慢指標旋轉了n圈。
(l + m×s + t - 1) / 2 = (l + n×s + t) 【時間相同】
=> (m - 2×n)×s = t + l + 1
=> (m - 2×n - 1)×s + s - t = l + 1
顯然,相遇後,讓乙個指標從鍊錶起始處開始運動,另乙個指標從相遇點的下乙個節點開始運動。這樣,兩個指標會在鍊錶的起始節點相遇。
node* first_node_in_cycle(node* head) const問題:求有環鏈表的環的長度。fast = fast->next;
slow =head;
while(fast !=slow)
return
fast;
}
解答:在前兩問的基礎之上。
2)使用快、慢指標時,我們可以在指標相遇後,固定乙個指標,然另乙個指標運動。當兩個指標再次相遇時,就是一圈的距離。
時間複雜度o(n),空間複雜度o(1)。
Mysql問題解決思路
資料庫層面 一 檢查問題常用工具 1 msyqladmin mysql客戶端,可進行管理操作 2 mysqlshow 功能強大的檢視shell命令 3 show session global variables 檢視資料庫引數資訊 4 show session global status 檢視資料庫...
約瑟夫環問題解決
問題描述 編號為1 n的n個士兵圍坐在一起形成乙個圈,從編號為1的士兵依次開始報數 1,2,3.依次報 數到m的士兵會被殺死出列,之後的士兵再從1開始報數。直到最後剩下一士兵。求這個士兵的編號。方法一 陣列 第一次做這個題的時候,第一反應就是用陣列來做。建立乙個boolean陣列,用true表示沒出...
「奇怪」問題解決思路整理
處理過各種各樣的 奇怪 問題,當然一般的問題,也不會找我處理 雖然每個問題最終產生的原因有各種各樣,但還是有些套路可以整理的 可以從以下幾個方面入手 準確描述問題現象,很重要。以下幾個點可以捋一下 1.現象能否重現?在什麼條件可以出現?重現頻率 分 極少出現,偶爾出現,頻繁出現,100 出現 2.出...