思路: 这道题我不会做,因为题目要求time complexity为O(n),space complexity为O(1)。看了答案知道这题涉及一个新算法:摩尔投票法。下面给出链接介绍摩尔投票法,讲的还不错:链接。中心思想其实就是抵消。最多只可能有两个majority elements。假设除了这两个数字以外,还有n个其他数字。再假设这两个数字个数分别为i,j。所以我们知道(i + j + n)= 所有数字个数。这时候我们可以得到i - n > 0; j - n > 0。这就是抵消的本质。具体摩尔投票法可以看上面那个链接还是很不错的。下面直接展示代码:
public class Solution {
public List<Integer> majorityElement(int[] nums) {
List<Integer> res = new ArrayList<>();
if(nums.length == 0)
return res;
int num1 = nums[0]; int num2 = nums[0]; int count1 = 0; int count2 = 0 ;
for (int val : nums) {
if(val == num1)
count1++;
else if (val == num2)
count2++;
else if (count1 == 0) {
num1 = val;
count1++;
}
else if (count2 == 0) {
num2 = val;
count2++;
}
else {
count1--;
count2--;
}
}
count1 = 0;
count2 = 0;
for(int val : nums) {
if(val == num1)
count1++;
else if(val == num2)
count2++;
}
if(count1 > nums.length/3)
res.add(num1);
if(count2 > nums.length/3)
res.add(num2);
return res;
}
}
总结:无