// 面試題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(constint* 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...