本题的难点在于理解多数投票算法(Boyer-Moore Voting Algorithm),
先上代码:
class Solution {public List<Integer> majorityElement(int[] nums) {List<Integer> result = new ArrayList<>();if (nums == null || nums.length == 0) {return result;}int num1 = nums[0];int num2 = nums[0];int count1 = 0;int count2 = 0;for (int i = 0; i < nums.length; ++i) {if (nums[i] == num1) {++count1;}else if (nums[i] == num2) {++count2;}else if (count1 == 0) {num1 = nums[i];count1 = 1;}else if (count2 == 0) {num2 = nums[i];count2 = 1;}else {--count1;--count2;}}count1 = 0;count2 = 0;for (int i = 0; i < nums.length; ++i) {if (nums[i] == num1) {++count1;}else if (nums[i] == num2) {++count2;}}if (count1 > nums.length / 3) {result.add(num1);}if (count2 > nums.length / 3) {result.add(num2);}return result;}}
这是关键部分:
if (nums[i] == num1) {++count1;}else if (nums[i] == num2) {++count2;}else if (count1 == 0) {num1 = nums[i];count1 = 1;}else if (count2 == 0) {num2 = nums[i];count2 = 1;}else {--count1;--count2;}
- 如果一个
num1的数量大于n/3,则需要至少同等数量的Fail Call(else path)才能抹除它,此时,意味着已经调用过n/3次--count2,所以关于num2的增操作(以及赋值操作)也至少有n/3。这就证明一旦有n/3个,就一定会被保留下来 只要弄明白
--操作不可能多于n/3,本题就不难时间复杂度:
- 空间复杂度:
Update July/13/2020
- 重新做又没有做出来
