給定乙個長度為 n+1 的陣列nums,陣列中所有的數均在 1∼n 的範圍內,其中 n≥1。
請找出陣列中任意乙個重複的數,但不能修改輸入的陣列。
樣例
給定 nums =[2
,3,5
,4,3
,2,6
,7]。返回 2 或 3。
思考題:如果只能使用 o(1) 的額外空間,該怎麼做呢?
暴力做法在此不做敘述,這裡講述空間複雜度o(1) 的做法
此題運用抽屜原理
用在這個題目中就是,一共有 n+1 個數,每個數的取值範圍是1到n,所以至少會有乙個數出現兩次。
然後我們採用分治的思想,將每個數的取值的區間[1, n]劃分成[1, n/2]和[n/2+1, n]兩個子區間,然後分別統計兩個區間中數的個數。
注意這裡的區間是指 數的取值範圍,而不是 陣列下標。
劃分之後,左右兩個區間裡一定至少存在乙個區間,區間中數的個數大於區間長度。
這個可以用反證法來說明:如果兩個區間中數的個數都小於等於區間長度,那麼整個區間中數的個數就小於等於n,和有n+1個數矛盾。
因此我們可以把問題劃歸到左右兩個子區間中的乙個,而且由於區間中數的個數大於區間長度,根據抽屜原理,在這個子區間中一定存在某個數出現了兩次。
依次類推,每次我們可以把區間長度縮小一半,直到區間長度為1時,我們就找到了答案。
class
solution
return r;}}
;
不修改陣列找出重複的數字
題目二 在乙個長度為n 1的陣列裡的所有數字都在1 n的範圍裡,所有陣列中至少有乙個數字是重複的。請找出陣列中任意乙個重複的數字,但不能修改輸入的陣列。方法一 優於題目要求不能修改輸入的陣列,我們可以建立乙個長度為n 1的輔助陣列,然後逐一把原陣列的每個數字複製到輔助陣列。如果原陣列中被複製的數字是...
不修改陣列找出重複的數字
在乙個長度為n 1的陣列裡的所有數字都在 1 n 的範圍內,所以陣列中至少有乙個數字是重複的。請找出陣列中任意乙個重複的數字,但不能修改輸入的陣列。例如,如果輸入長度為 8 的陣列 那麼對應的輸出是重複的數字 2 或者 3。這道題目可以把 1 n 數字從中間的數字 m 分為兩部分,前面一半為 1 m...
陣列 不修改陣列找出重複的數字
不修改陣列找出重複的數字 題目 在乙個長度為n 1的陣列裡的所有數字都在1到n的範圍內,所以陣列中至少有乙個數字是重複的。請找出陣列中任意乙個重複的數字,但不能修改輸入的 陣列。例如,如果輸入長度為8的陣列,那麼對應的輸出是重複的數字2或者3。方法 我們把從1 n的數字從中間的數字m分為兩部分,前面...