1. 程式人生 > >算法(9)Find the Duplicate Number

算法(9)Find the Duplicate Number

lee leetcode 題目 但是 ron ont 拼圖遊戲 裏的 要求

一個數組中的長度是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]

呀,那麽怎麽保證i和j一定是在這個環上的呢?【這也是該想法跑不到我們腦子裏的原因】還是因為題目中的要求太緊了,1->n的數字,散落在0,1->n的空間裏,從0開始跳,那麽很可能是一下子就跳到了重復元素也可能不是,但是任你怎麽堅持到最後,環的入口必然來臨,在下面這種場景:

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