1. 程式人生 > >找出陣列中任一重複的數_C++

找出陣列中任一重複的數_C++

        題目:一個長度為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;
}