不修改陣列找出重複的數字
題目:在乙個長度為n+1的陣列裡的所有數字都在1到n的範圍內,所以陣列中至少有乙個數字是重複的。請找出陣列中任意乙個重複的數字,但不能修改輸入的 陣列。例如,如果輸入長度為8的陣列,那麼對應的輸出是重複的數字2或者3。
方法:我們把從1~n的數字從中間的數字m分為兩部分,前面一半為1~m,後面一半為m+1~n,如果1~m的數字數目超過m,則這一半的區間一定有重複包含的數字;否則另一半有重複數字;那麼我們可以繼續把包含重複數字的區間一分為二,直到找到這個重複數字為止,方法與二分查詢法類似,但是多了一步統計區間數字的數目,時間複雜度o(nlogn),空間複雜度o(1).
//不修改陣列找出重複的數字
// 題目:在乙個長度為n+1的陣列裡的所有數字都在1到n的範圍內,所以陣列中至
// 少有乙個數字是重複的。請找出陣列中任意乙個重複的數字,但不能修改輸入的
// 陣列。例如,如果輸入長度為8的陣列,那麼對應的
// 輸出是重複的數字2或者3。
#include int countrange(const int *arr, int length, int start, int middle);
int getduplication(const int* arr, int length)
if (count > (middle - start + 1))
end = middle;
else
start = middle + 1;
} return 0;
}int countrange(const int *arr, int length, int start, int middle)
void test1()
; int duplication = getduplication(array1, sizeof(array1) / sizeof(array1[0]));
if (duplication)
printf("數字:%d 重複", duplication);
else
printf("沒有數字重複");
printf("\n");
}void test2()
; bool duplication = getduplication(array2, sizeof(array2) / sizeof(array2[0]));
if (duplication)
printf("數字:%d 重複", duplication);
else
printf("沒有數字重複");
printf("\n");
}void test3()
; bool duplication = getduplication(array3, sizeof(array3) / sizeof(array3[0]));
if (duplication)
printf("數字:%d 重複", duplication);
else
printf("沒有數字重複");
printf("\n");
}void test4()
; int duplication = getduplication(array4, sizeof(array4) / sizeof(array4[0]));
if (duplication)
printf("數字:%d 重複", duplication);
else
printf("沒有數字重複");
printf("\n");
}void test5()
; int duplication = getduplication(array5, sizeof(array5) / sizeof(array5[0]));
if (duplication)
printf("數字:%d 重複", duplication);
else
printf("沒有數字重複");
printf("\n");
}int main()
不修改陣列找出重複的數字
題目二 在乙個長度為n 1的陣列裡的所有數字都在1 n的範圍裡,所有陣列中至少有乙個數字是重複的。請找出陣列中任意乙個重複的數字,但不能修改輸入的陣列。方法一 優於題目要求不能修改輸入的陣列,我們可以建立乙個長度為n 1的輔助陣列,然後逐一把原陣列的每個數字複製到輔助陣列。如果原陣列中被複製的數字是...
不修改陣列找出重複的數字
在乙個長度為n 1的陣列裡的所有數字都在 1 n 的範圍內,所以陣列中至少有乙個數字是重複的。請找出陣列中任意乙個重複的數字,但不能修改輸入的陣列。例如,如果輸入長度為 8 的陣列 那麼對應的輸出是重複的數字 2 或者 3。這道題目可以把 1 n 數字從中間的數字 m 分為兩部分,前面一半為 1 m...
不修改陣列找出重複的數字
給定乙個長度為 n 1 的陣列nums,陣列中所有的數均在 1 n 的範圍內,其中 n 1。請找出陣列中任意乙個重複的數,但不能修改輸入的陣列。樣例給定 nums 2 3,5 4,3 2,6 7 返回 2 或 3。思考題 如果只能使用 o 1 的額外空間,該怎麼做呢?暴力做法在此不做敘述,這裡講述空...