查詢陣列中重複次數最多的數字
阿新 • • 發佈:2018-12-31
題目:
給定一個大小為n的陣列,該陣列包含數字的範圍在 [0...k-1], k是一個正整數,k < = n。在這個陣列找到重複次數最多的數字。
要求時間複雜度為n,空間複雜度為1,可以使用原陣列。
原理:
遍歷陣列,讓每個元素作為下標的元素加k,最後誰的值最大,則它對應的下標就是要求的值。
解法:
遍歷陣列,每個元素值作為下標的元素+=k;由於會改變陣列後面的值,而我們還要根據陣列本來的值作為下標呢,所以這裡,陣列原來的值=陣列現在的值%k;最後比較哪個元素值最大,則它的下標就是要求的值。
註解:為何每次要加k?
原因1:陣列的所有值都小於k,則出現次數最多的元素,以它為下標的元素加k的次數也最多,則其遍歷一次後也就會最大。
原因2:由於每次都加的是k。則現在值=原來值+m個k;所以陣列原來的值很好求:原來值=現在值%k。
下面給出C++程式碼:
#include<iostream> #define LEN(array,len) {len=sizeof(array)/sizeof(array[0]);} using namespace std; int MaxRepeatingNum(int a[], int k) { int maxcount=0; int length; LEN(a,length); int max=a[0]; for(int i=0;i<length;i++){ a[a[i]%k]+=k; if(maxcount<a[a[i]%k]){ maxcount=a[a[i]%k]; max=a[i]%k; } } return max; } int main() { int a[]={3,6,5,4,2,3,6,9,8,1,2,3}; cout<<MaxRepeatingNum(a,10)<<endl; system("pause"); }