1. 程式人生 > >查詢陣列中重複次數最多的數字

查詢陣列中重複次數最多的數字

題目:

給定一個大小為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");
}