數組中找到重復的數字
阿新 • • 發佈:2018-08-18
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)(不推薦,這裏並不能確定找出所有重復數字)
這裏就不放算法了。
數組中找到重復的數字