#使用摩尔投票法来解决 面试题 17.10. 主要元素 ##思路方面:采用摩尔投票法 题目要求 在数组中寻找可能存在的多数元素,这个元素的个数占到了数组元素的一半以上; 在遍历数组之后。若是存在这个数字,就返回这个数字。否则返回-1;
我们定义一个变量 temp 来保存数组第一个元素作为可能是主要元素的值,Count 用来记录该值的出现次数。然后在遍历数组,过程中执行如下逻辑: 出现相同的数字就让其自增,否则就让其自减。如果 Count 为 0:说明之前出现过的 temp(假设的主要元素) 已经被抵消完了,更新一下 temp为当前值,temp = nums[i], Count = 1; 但是有一种出现了一种特殊情况: 当输入:[1,2,3] 输出:3 预期结果:-1 因此我们需要再进行一次遍历,检查这个主要元素出现次数是否超过总数一半。 如果是,就返回这个值。否则就按照题目要求返回-1。 ##代码
int majorityElement(int* nums, int numsSize){
int ans = nums[0], Count = 1;
for (int i = 1; i < numsSize; i++) {
if (Count == 0) {
Count = 1;
ans = nums[i];
}else {
if (nums[i] != ans)
--Count;
else
++Count;
}
}
// 以下代码为了解决这个问题 这就是摩尔投票法的不足之处吧
//输入:[1,2,3] 输出:3 预期结果:-1
Count = 0;
for (int i = 0; i < numsSize; i++) {
if(nums[i] == ans)
Count++;
}
if(Count*2 > numsSize)
return ans;
return -1;
}