數組中重復的數字
阿新 • • 發佈:2018-12-05
ostream stream ++ 輸出 code empty pac != 等於
題目
在一個長度為n的數組裏的所有數字都在0到n-1的範圍內。 數組中某些數字是重復的,但不知道有幾個數字是重復的。也不知道每個數字重復幾次。請找出數組中任意一個重復的數字。
例如,如果輸入長度為7的數組{2,3,1,0,2,5,3},那麽對應的輸出是重復的數字2或者3。
思路
1、排序
將數組排序,然後掃描排序後的數組即可。
時間復雜度:O(nlogn),空間復雜度:O(1)
2、哈希表
從頭到尾掃描數組,每掃描到一個數字,判斷該數字是否在哈希表中,如果該哈希表還沒有這個數字,那麽加入哈希表,如果已經存在,則返回該數字;
時間復雜度:O(n),空間復雜度:O(n)
3、交換
0~n-1正常的排序應該是A[i]=i;因此可以通過交換的方式,將它們都各自放回屬於自己的位置;
從頭到尾掃描數組A,當掃描到下標為i的數字m時,首先比較這個數字m是不是等於i,
如果是,則繼續掃描下一個數字;
如果不是,則判斷它和A[m]是否相等,如果是,則找到了第一個重復的數字(在下標為i和m的位置都出現了m);如果不是,則把A[i]和A[m]交換,即把m放回屬於它的位置;
重復上述過程,直至找到一個重復的數字;
時間復雜度:O(n),空間復雜度:O(1)
(將每個數字放到屬於自己的位置最多交換兩次)
#include <iostream> #include <vector> using namespace std; void dup(vector<int> &v) { if(v.empty()) { cout<<" 數組為空."<<endl; return; } for(int i=0;i<v.size();++i) { if(v.at(i)<0) return; while(v.at(i)!=i) { if(v.at(i)==v.at(v.at(i))) { cout<<v.at(i)<<endl; break; } swap(v.at(i),v.at(v.at(i))); } } } int main() { int n; cout<<" 請輸入元素的個數:"<<endl; cin>>n; vector<int> v; for(int i=0;i<n;++i) { int t; cin>>t; v.push_back(t); } dup(v); for(auto i:v) cout<<i<<" "; cout<<endl; return 0; }
數組中重復的數字