題目:給定一個長度為N的數組,其中每個元素的取值范圍都是1到N。判斷數組中是否有重復的數字。(原數組不必保留)
方法1.
對數組進行排序(快速,堆),然后比較相鄰的元素是否相同。
時間復雜度為O(nlogn),空間復雜度為O(1)。
方法2.
使用bitmap方法。
定義長度為N/8的char數組,每個bit表示對應數字是否出現過。遍歷數組,使用 bitmap對數字是否出現進行統計。
時間復雜度為O(n),空間復雜度為O(n)。
方法3.
遍歷數組,假設第 i 個位置的數字為 j ,則通過交換將 j 換到下標為 j 的位置上。直到所有數字都出現在自己對應的下標處,或發生了沖突。
時間復雜度為O(n),空間復雜度為O(1)。
方法3示例代碼如下
#include<iostream> #include<ctime> using namespace std; //判斷數組中是否包含重復數字 const int MAX= 10; bool isDuplicate(int val[]) { for(int i=0;i<MAX;i++) { if(val[i]!=i) { if(val[i] != val[val[i]]) swap(val[i],val[val[i]]); else return true; } } return false; } int main() { int val[MAX]; srand((unsigned)time(NULL)); cout<<"init data:"<<endl; for(int i=0;i<MAX;i++) { int tmp=rand()%MAX; val[i]=tmp; cout<<tmp<<" "; } cout<<endl; bool flag=isDuplicate(val); if(flag) cout << "has duplicate elem" << endl; else cout << "no duplicate elem" << endl; }
srand((unsigned)time(NULL));
time()頭文件為ctime.這句話不要程序每次運行結果都一樣。
: