本题的难点在于理解多数投票算法(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
- 重新做又没有做出来