找出陣列中任一重複的數_C++
阿新 • • 發佈:2019-01-14
題目:一個長度為n的陣列,陣列中的值屬於0~(n-1)範圍內。現已知該陣列中一定有重複的數字,請找出任意一個重複的數字。
思路:如果該陣列中沒有重複的數字,那麼下標和下標對應的值就相等了,即是array[i] == i。利用好這點,尋求解題方法。
方法一:(1) 將陣列從小到大排序。(2) 遍歷判斷 array[i] 和 i 之間的關係,不相等,即array[i]重複了。
方法二:判斷 array[i] 和 i 是否相等。(1) 相等:i++,即判斷下一個。(2) 不相等:判斷array[i] 和array[array[i]]是否相等。相等即重複了,直接return;不相等,將 array[i] 和array[array[i]]交換。然後又從 i 重新執行思路二的判斷。
演算法選擇:優選方法二,時間複雜度低。
方法二為何優於方法一?
答:方法二迴圈的主要是為了:將下標 i 相等的值,放到陣列下標為 i 的位置。這個過程迴圈次數小於方法一中的(1)步驟,並且迴圈過程就判斷了是否重複,減少了方法一的(2)步驟。時間複雜度遠小於方法一。
程式碼:
#include <stdio.h> #include <iostream> using namespace std; int duplication = 0; bool testfunc(int num[], int length) { int i = 0; if((length <= 0) && (num == NULL)) return false; for(int i = 0; i < length; i++) { if((num[i] < 0) && (num[i] > (length - 1))) return false; } while(i < length) { if(num[i] == i) i++; else { if(num[i] == num[num[i]]) { duplication = num[i]; return true; } else swap(num[i], num[num[i]]); } } return false; } int main(int argc, char *argv[]) { int length = 8; int num[8] = {2, 7, 2, 3, 4, 5, 1, 5}; testfunc(num, length); printf("duplication is : %d\n", duplication); return 0; }