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

2021-08-25 22:26:01 字數 2027 閱讀 6332

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

題目:在乙個長度為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 的額外空間,該怎麼做呢?暴力做法在此不做敘述,這裡講述空...