如何找出數組中重復次數最多的數


方法一:以空間換時間,可以定義一個數組int count[MAX],並將其數組元素都初始化為0,然后執行for(int i=0;i<100;i++) count[A[i]]++;操作,這樣比如A[0]、A[3]和A[5]都為2,那么count[2]的值就為3,最后在count中找最大的數對應的下標,即為重復次數最多的數。

程序示例如下:

#include "stdafx.h"
int GetMaxNum(int* arr, int len, int& num)
{
	int index = arr[0];	
	int i;
	for (i = 0; i < len; i++)	{
		
		if (arr[i]>index)
		{
			index = arr[i];
			num = i;
		}
		//printf("%d\n", num);
	}
	return index;
}
int main()
{
	int array[] = { 1, 1, 2, 2, 4, 4, 4, 4, 5, 5, 6,6 };
	int length = sizeof(array) / sizeof(array[0]);
	int i;
	int num = 0;
	int* count = new int[GetMaxNum(array, length, num)];
	
	for (i = 0; i < length; i++)
		count[i] = 0;
	for (i = 0; i < length; i++)
		count[array[i]]++;
	printf("最大的數出現的次數是:%d\n", GetMaxNum(count, GetMaxNum(array, length, num), num));
	printf("出現次數最多的數是:%d\n", num);
	getchar();
	return 0;
}

  效果如圖:

    

上例是一種典型的空間換時間算法。一般情況下,除非內存空間足夠大,否則一般不采用這種方法。

方法二:使用map映射表,通過引入map表來記錄每一個元素出現的次數。map是STL的一個關聯容器,它提供一對一的數據處理能力,其中第一個為關鍵字,每個關鍵字只能在map中出現一次,第二個稱為該關鍵字的值,map的初始化值全部為0.我們設定初始狀態時重復次數最多的數為val,那么它的出現次數就為map[val]。對目標數組中的每一個元素都與當前的最大重復次數,即map[val]作比較,若大於等於map[val],那val就該換為該元素了。這樣一輪循環過后,就能找出重復次數最多的元素了。

程序示例如下:

#include "stdafx.h"
#include <iostream>
#include <map>
using namespace std;

bool findMostFrequentInArray(int *a, int size, int &val)
{
	if (a == NULL || size <= 0)
		return false;
	map<int, int> m;
	for (int i = 0; i < size; i++)
	{
		m[a[i]]++;
		if (m[a[i]] >= m[val])
		val = a[i];
		//cout << a[i]<<m[a[i]] << endl;
	}
	return true;
}
int main()
{
	int val = 0;
	int a[] = { 1, 5, 4, 3, 4, 4, 5, 4, 5, 5, 6 };
	if (findMostFrequentInArray(a, 11, val))
		cout << val << endl;
	getchar();
	return 0;
}

  效果如圖:

    我覺着這種方法更快,時間復雜度只有O(n)的說。。。。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM