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

數組中重復的數字

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; }

數組中重復的數字