如何在未排序的整数数组中找到出现最大次数(模式)的整数?
我能想到的一种O(nlogn)
方法就是排序。还有其他更好的方法吗?
答案 0 :(得分:4)
以下是您将要做的事情的基本概要:
Time Complexity : O(n logn)+ O(n) Space Complexity : InPlace , no hash table or hash map is required.
以下是代码:
public void Max_Occurrence(int[] arr)
{
int count=1;
int max_count =1;
int max_value = arr[0];
for(int i=1; i<arr.length ; i++)
{
if(arr[i-1] == arr[i])
{
count++;
if(max_count<count)
{
max_count = count;
max_value = arr[i];
}
}
else
{
count = 1;//changing from count++. As per the steps mentioned above it should be reset to count = 1. Suggested by an anonymous user
}
}
System.out.println("Result:"+max_value+" has occured "+max_count+"of times");
}
答案 1 :(得分:3)
我想你想找出阵列中出现次数最多的元素 - 如果您不关心内存,则遍历数组一次,增加哈希表中每个元素的计数。然后找到计数最高的那个。你需要一个遍历数组和一个哈希表。
所以在伪代码中:
hashtable hash;
foreach(element in array){
if(!hash.contains(element))
hash[element] = 1;
else
hash[element]++;
}
int max = 0;
max_element;
foreach(element in hash)
if(hash[element] > max)
{
max_element = element;
max = hash[element];
}
//max_element contains the maximum occuring one.
答案 2 :(得分:0)
如果你使用的是Linq,你可以这样做
IEnumerable.Max();
答案 3 :(得分:0)
您可以使用哈希表,其中“数组中的数字”作为键,“出现次数”作为值。
示例代码如下:
hashtable h;
for every entry in array
search hashtable
if present, increment num_occurrences
else, create new entry
Iterate over all the entries in hashtable and return one
with max num_occurrences
由于哈希搜索被认为是O(1),因此整体复杂度将为O(n)。
此问题的一个特例是当数组中的数字在给定范围内时,在这种情况下,在原始数组中使用另一个最大值大小的整数数组,并使用新数组的索引作为键和存储在此数组中的数字作为出现次数。
返回此数组中最大值的索引。
答案 4 :(得分:0)
试试这个。
class max_frequency
{
private int a[]=new int[20];
public void accept(int a1[])
{
a=a1;
}
public void sort()
{
int i,j,t;
for(i=0;i<20;i++)
{
for(j=i+1;j<20;j++)
{
if(a[i]>a[j])
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
}
int count=1;
int max_count=1;
int max_value=0;
for(i=1;i<a.length;i++)
{
if(a[i-1]==a[i])
{
count++;
if(max_count<count)
{
max_count=count;
max_value=a[i];
}
}
else
{
count=1;
}
}
System.out.println("Result : "+max_value+ " has occured "+max_count+ " times");
}
}