1. 程式人生 > >數組中找到重復的數字

數組中找到重復的數字

n) 復雜 時間復雜度 [] 發現 推薦 題目 spa 重復

1、要求從一個數組中獲取最小的重復的數字,亂序數組,給定範圍:長度n,大小0~n-1

class solution
{
public:
    bool findDuplicate(int nums[],int length,int *p)
    {
        if(nums == nullptr)
        {
            cout<<"數組不存在,請檢查"<<endl;
            return false;
        }

        for(int i=0; i<length; i++)
            
if(nums[i]<0 || nums[i] > length-1) { cout<<"輸入不合法,請檢查"<<endl; return false; } int temp; for(int i=0; i<length; i++) { while(nums[i] != i) { if(nums[i] == nums[nums[i]])    {   
*p = nums[i]; return true; } temp = nums[i]; nums[i]= nums[temp]; nums[temp] = temp; } } } };

分析題目,發現條件本身比較苛刻,說明數組是有特殊解法的,由於範圍被限制在數組長度以內的大小,因此可以通過數組實現一個簡單的哈希表,即將下標作為key以及value,當前位置如果不是正確的值,則去和應該所處在的位置的值進行交換,如果當前

位置和即將交換的位置值一致,則說明該位置上對應的數字是重復。之所以采用這種方式是因為,哈希查找的效率是O(1),因此整體算法的時間復雜度為O(n),空間復雜度為O(1).

2、進一步要求不可以修改數組

思路:以空間換時間,格外聲明一個數組,按第一種方式存儲,查找,返回。時間復雜度O(n),空間復雜度O(n)

或者以時間換空間,由於重復數字的存在,那麽由二分法可以不斷劃分數組,在某個區間,由於重復數字出現的原因,會出現[m,n]之間的數字個數大於n-m+1個。時間復雜度O(nlogn),空間復雜度O(1)(不推薦,這裏並不能確定找出所有重復數字)

這裏就不放算法了。

數組中找到重復的數字