[ref]
对Moore Voting算法解析
http://blog.csdn.net/joylnwang/article/details/7081575
public class Solution { public List<Integer> majorityElement(int[] nums) { // Moore voting List<Integer> result = new ArrayList<Integer>(); if (nums == null || nums.length == 0) return result; int N = nums.length; int cand1 = nums[0], counter1 = 1; int i = 1; while (i < N && cand1 == nums[i]) { counter1++; i++; } if (i == N) { result.add(cand1); return result; } int cand2 = nums[i++], counter2 = 1; while (i < N) { if (nums[i] == cand1) { cand1 = nums[i]; counter1++; } else if (nums[i] == cand2) { cand2 = nums[i]; counter2++; } else { if (counter1 == 0) { cand1 = nums[i]; counter1++; } else if (counter2 == 0) { cand2 = nums[i]; counter2++; } else { counter1--; counter2--; } } i++; } // check cand1 & cand2 int c1 = 0, c2 = 0; for (int j = 0; j < N; j++) { if (cand1 == nums[j]) c1++; else if (cand2 == nums[j]) c2++; } if (c1 > N / 3) result.add(cand1); if (c2 > N / 3) result.add(cand2); return result; } }