Leetcode 面试题 17.10. 主要元素

95 阅读1分钟

#使用摩尔投票法来解决 面试题 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;

}