面試題3(二) 不修改陣列找出重複的數字

2021-09-08 06:43:05 字數 1314 閱讀 6750

// 面試題3(二):不修改陣列找出重複的數字

// 題目:在乙個長度為n+1的陣列裡的所有數字都在1到n的範圍內,所以陣列中至

// 少有乙個數字是重複的。請找出陣列中任意乙個重複的數字,但不能修改輸入的

// 陣列。例如,如果輸入長度為8的陣列,那麼對應的

// 輸出是重複的數字2或者3。

不能修改陣列,可以建立乙個長度為n+1的輔助陣列,空間複雜度為o(n)。

如果用時間換空間的話,可以使用二分查詢的思想。

元素範圍為1~n,但是有n+1個元素,說明有某個數字重複了。

以中間數字m為界限,分成兩部分,1~m和m+1~n。

如果1~m的元素個數超過了m,說明重複元素在前半部分,再次劃分1~m。

重複此過程,直到最後找出重複元素。

if

(輸入引數無效)

return -1

;int start=1

;int end=length-1

;while(start<=end)

if(count>(middle-start+1

)) end=middle;

else

start=middle+1;}

return -1;

int getduplication(const

int* numbers,int

length)

for(int i=0;i)

}//二分查詢重複元素

int start=1

;

int end=length-1

;

while(end>=start)

//區間上下限不等,繼續二分查詢

if(count>(middle-start+1

)) end=middle;

else

start=middle+1

; }

return -1;}

//獲取區間元素個數

int countrange(const

int* numbers,int length,int start,int

middle)

int count=0

;

for(int i=0;i)

return

count;

}

劍指offer面試題3(二)

posted @

2018-08-01 23:24

朕蹲廁唱忐忑 閱讀(

...)

編輯收藏

面試題3 題目二 不修改陣列找出重複數字

題目 在乙個長度為n 1的陣列裡的所有數字都暗自1 你的範圍內,所以陣列中至少有乙個數字是重複的。請找出陣列中任意乙個重複的數字,但不能修改輸入的陣列。例如,如果輸入長度為8的陣列,那麼對應的輸出是重複的數字2或者3.二分的 思路看書 public static void main string a...

不修改陣列找出重複的數字

題目二 在乙個長度為n 1的陣列裡的所有數字都在1 n的範圍裡,所有陣列中至少有乙個數字是重複的。請找出陣列中任意乙個重複的數字,但不能修改輸入的陣列。方法一 優於題目要求不能修改輸入的陣列,我們可以建立乙個長度為n 1的輔助陣列,然後逐一把原陣列的每個數字複製到輔助陣列。如果原陣列中被複製的數字是...

不修改陣列找出重複的數字

在乙個長度為n 1的陣列裡的所有數字都在 1 n 的範圍內,所以陣列中至少有乙個數字是重複的。請找出陣列中任意乙個重複的數字,但不能修改輸入的陣列。例如,如果輸入長度為 8 的陣列 那麼對應的輸出是重複的數字 2 或者 3。這道題目可以把 1 n 數字從中間的數字 m 分為兩部分,前面一半為 1 m...