解决问题:在一个整数序列A中,如果整数r在A中出现的次数大于序列A的一半,那么我们把这个r称为多数元素。如何更快的找出这个元素呢?
Java实现过程如下:
package candidate;
public class Candidate
{
// 递归实现
public int candidateSort(int[]a, int start, int end)
{
int c = a[start];
int count = 1;
int j;
for (j=start;j<end && count>0;j++)
{
if (c == a[j])
{
count++;
}
else {
count--;
}
}
if (j == end)
{
return c;
}
else {
return candidateSort(a, j+1, end);
}
}
// 循环实现
public int candidateSort(int[] a)
{
int c = a[0];
int count = 0;
for (int i=1; i<a.length;i++)
{
if (c == a[i])
{
count++;
}
else if (count < 0) {
c = a[i];
count = 0;
}
else {
count--;
}
}
return c;
}
// a[0...n-1]若存在多数元素则输出,否则输出-1
public int Majority(int a[], int n)
{
int c = candidateSort(a, 1, 7);
int count = 0;
int majority;
for (int i = 0; i < n; ++ i)
{
if (a[i] == c)
count++;
}
if (n%2 == 0)
majority = n/2 + 1;
else
majority = n/2;
if (count > majority)
return c;
else
return -1;
};
public static void main(String[] args)
{
int[] date = {1,3,2,3,3,4,3};
System.out.println(new Candidate().candidateSort(date, 0, date.length-1));
System.out.println(new Candidate().candidateSort(date));
System.out.println(new Candidate().Majority(date, 7));
}
}
结果为:
3
3
3