数组A是具有n个元素的数组,x是A中的一个元素,若A中有一半以上的元素与A相同,则称x是数组A的主元素。例如 ,数组A={1,3,2,3,3,4,3},元素3就是该数组的主元素。
1、移去数组中的两个不同元素后,如果原来数组中有主元素,那么该主元素依然是新数组的主元素。
2、如果数组2k个元素中有k个元素相同(k<n/2),移去这2k个元素以后,如果原来数组中有主元素,那么该主元素依然是新数组的主元素。
如果新数组只剩下一个元素,该元素可作为主元素的候选者。新数组是若干个相同元素,该元素可作为主元素的候选者。没有剩下元素时,则原来数组没有主元素。
count为一个初值为0的计数器,当扫描元素时,如果当前元素和num表示的元素相等,则计数器加1,否则计数器减1.当所有元素扫面以后,如果计数器大于0,说明数组还有若干个与num相等的元素未移除,则num为主元素候选者。
1 public class Demo<T> {
2
3 public T num;
4 public T A[];
5
6 public Demo(T A[]) {
7 this.A = A;
8 }
9
10 public boolean candidate(int m) {
11 int count = 1;
12 int i = m;
13 int n = A.length;
14 num = A[i];
15 while (i < n - 1 && count > 0) {
16 if (A[++i].equals(num))
17 count++;
18 else
19 count--;
20 }
21 if (i == n - 1 && count > 0)
22 return true;
23 else if (i == n - 1 && count == 0) {
24 return false;
25 } else
26 return candidate(i + 1);
27 }
28
29 public boolean majority() {
30 int count = 0;
31 boolean flag = candidate(0);
32
33 if (flag) {
34 for (T a : A) {
35 if (num.equals(a))
36 count++;
37 }
38 if (count < A.length / 2)
39 return false;
40 }
41 return flag;
42 }
43
44 public T getNum() {
45 return num;
46 }
47
48 public static void main(String[] args) {
49
50 String A[] = {"a", "c", "a", "b", "a" };
51 Demo<String> d1 = new Demo<>(A);
52 boolean sign = d1.majority();
53 if (sign) {
54 System.out.println(d1.getNum());
55 } else
56 System.out.println("主元素不存在");
57 }
58 }
GitHub : https://github.com/fxiaoyu97
微信公众号 : 三更编程菌