Skip to the content.

Ex39 数组中出现次数超过一半的数字

题目描述

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。

解题思路

以下的代码很清晰明了就不再多做解释了。但是,这里说一个注意的点:

《剑指Offer》中的题目考虑到了找不到这么一个数的时候的情况,但是LeetCode上却没有。以LeetCode上的题目为准的话,最后需要确认一下,找到的数字是不是超过一半的。因为按照下面的思路,如果数组中有超过一半的数字,那么找到的数字,就一定是超过一半的数字;但如果数组中没有超过一半的数字,那么找到的数字就就肯定不是了。

代码

class Solution
{
public:
  int
  majorityElement (std::vector<int> &nums)
  {
    int num = nums[0], count = 1;
    for (int i = 1; i < nums.size (); ++i)
      {
        if (nums[i] == num)
          {
            ++count;
          }
        else
          {
            --count;
            if (count <= 0)
              {
                count = 1;
                num = nums[i];
              }
          }
      }
    return num;
  }
};

结果

执行结果:通过

执行用时:44 ms, 在所有 C++ 提交中击败了72.80%的用户

内存消耗:18.8 MB, 在所有 C++ 提交中击败了13.37%的用户