算法(9)Find the Duplicate Number
一個數組中的長度是n+1,裏面存放的數字大小的範圍是【1,n】,根據鴿巢原理,所以裏面肯定有重復的數字,現在預定重復的數字就1個,讓你找到這個數字!
http://bookshadow.com/weblog/2015/09/28/leetcode-find-duplicate-number/
使用坐標和數值之間的相互轉換!計算機界廣為人知的環檢測的問題。
網上對這個問題的解釋太多了,一搜一大把,環檢測方法才是真是的解題之道,環解決方法在上面的鏈接中有,但是讓人茅塞頓開的一個點是在這種解法中是如何合理使用了下標0!!!!還是先分析下這個題目:是說有1到n,n個數字,然後數組的size是n+1的,如果玩過那種動態的拼圖遊戲,那麽0這個位置就是拼圖盤上那個永遠的空位呀!!!假設一種場景是重復的數字只重復1次,那麽我們各個數不斷各種轉化之後,那麽在0這個位置的就是多出來的數字呀!那麽攻略中提出來的辦法就是找到後面環的入口了!要怎麽找呢?!下標從1->n中一定會有環呢?這個是要證明的!這是因為題目中已經說了存在i和j,使得a[i]=a[j]
0 1 2 3 4
3 4 1 2 4
a[0] = 3; a[3] = 2; a[2] = 1; a[1] = 4; a[4] = 4;
你僥幸地想著怎麽讓元素不形成環,但是發現逼到最後,你消耗完了所有的1->n,沒辦法了,最後一個位置只能從1->n中任選一個填上!
那麽就用經典的鏈表的解決方法來解吧。
環檢測的問題:典型場景-->鏈表
算法(9)Find the Duplicate Number