我试图编写一个算法,如果数组中存在多数元素则返回true,否则返回false。 编辑:我只能判断两个元素是否相等。意思是我不能使用<或>,仅=。 编辑:解决方案应采用分而治之的方法。 它的运行时不应该超过nlogn,我在java中写了一些东西,但我不确定它是否正确以及如何计算运行时.. 这是我得到的:
public static boolean MajorityBoolean(int[] arr) {
int c;
int n = arr.length;
for (int i = 0; i < n; i = i + 2) {
System.out.println("*");
if ((arr[i] == arr[(i + 1)%n]) || ((arr[i] == arr[(i - 1+n)%n]))) {
c = 0;
for (int j = 0; j < n; j = j + 1)
if (arr[j] == arr[i])
c = c + 1;
if (c > n / 2)
return true;
}
}
return false;
}
答案 0 :(得分:5)
所述算法的运行时为O(n^2)
。外循环执行n/2
次,因此内部计数器j
重置n/2
次,因此内循环总共执行O(n^2)
次。
我不确定我是否遵循了您的想法背后的逻辑,但这里有两种方法我将如何实现它[在高级伪代码中]:
(1)从数据中创建histogram:
Map<Integer,Integer>
[键是元素,值是出现次数] 如果您使用HashMap
作为地图,则此方法的平均值为O(n)
。
(2)排序并找到最大出现次数:
Arrays.sort(array)
进行排序。此解决方案为O(nlogn)
平均值+最差情况[实际上,取决于排序 - merge sor t为您提供O(nlogn)
最差情况,而quick-sort为您提供O(n^2)
最糟糕的情况,平均情况下都是O(nlogn)
。
编辑:
我误解了手头的问题,我以为你在寻找是否有一个独特的最大值。这两个解决方案仍然适用于这个问题,您只需要修改每个解决方案的最后一步[检查最常出现的元素是否出现超过一半的时间,这在O(n)
]中再次相当容易和可行。
此外,还有另一种解决方案:使用selection algorithm查找中位数,找到它后,检查它是否为多数元素,如果是,则返回。由于选择算法是基于分而治之的解决方案,我认为它符合您的需求。
答案 1 :(得分:1)
大小为n的数组A []中的多数元素是一个出现超过n / 2次的元素
public static boolean find(int[] arr, int size) {
int count = 0, i, mElement;
for (i = 0; i < size; i++) {
if (count == 0)
mElement = arr[i];
if (arr[i] == mElement)
count++;
else
count--;
}
count = 0;
for (i = 0; i < size; i++)
if (arr[i] == mElement)
count++;
if (count > size/2)
return true;
return false;
}
答案 2 :(得分:0)
以下是O(n)解决方案 Find Majority Element