前提是主元素一定存在
/**
* 核心思想:在元素数组中,删去不同的两个元素,数组的主元素保持不变。
*/
public class MainElement {
public static void main(String[] args) {
int[] numbers = {1, 2, 1, 2, 2, 2, 3};
int mainElement = findMainElement(numbers);
System.out.println(mainElement);
}
private static int findMainElement(int[] numbers) {
int len = numbers.length;
if (len == 0) {
return 0;
}
if (len == 1) {
return numbers[0];
}
// 刚开始的时候,假设第0个元素是主元素,那么此时有1个主元素
int count = 1;
int mainFrom = 0;
int start = numbers[mainFrom];
// 第0个元素已经由假设的主元素占据,那么将从第1个元素开始比较
for (int i = 1; i < len;) {
if (start == numbers[i]) {
// 如果当前元素与假设的主元素相同,计数+1
count++;
} else {
// 如果当前元素与假设的主元素不同,计数-1
count--;
}
if (count == 0) {
// 扔掉了偶数个(2、4、6...)不同的元素,需要将计数置为1,此时假设下一个元素为主元素,则指针需要指向下下个(你没有看错,确实是“下下个”)元素
count = 1;
mainFrom = i+1;
start = numbers[mainFrom];
i += 2;
continue;
}
if (count > (len-mainFrom)/2) {
// 这时候人品爆发,捡到的元素个数已经大于(从mainFrom到len-1的元素个数【包含mainFrom和len-1】)/2,可以确定该元素就是我们要找的
return numbers[mainFrom];
}
i++;
}
return start;
}
}