题目:
剑指 Offer 39. 数组中出现次数超过一半的数字
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]
输出: 2
思路
当然此题可以用哈希来做,但是呢。我们需要时间复杂度是o(n),空间复杂度是o(1),这就表示数组遍历有限次,并且仅仅需要有限个辅助变量。
本题采用的是投票法:(每次消除两个不同的数,留下的数就是我们需要求的那个数。
==》代码思路:每次比较相邻的两个数,如果不同,coun–;相同数字,coun++,count=0时,当前targetNumber=arr[i],然后继续遍历)
具体代码如下
#include<iostream>
#include<vector>
using namespace std;
class Solution {
public:
int majorityElement(vector<int>& nums)
{
//使用投票法
int vote = 0;
int targetNumber;
for (int i = 0;i < nums.size();i++)
{
if (vote == 0)//如果刚开始结果为0的就用 当前元素赋值
{
targetNumber = nums[i];
vote++;
}
else
{
if (nums[i] != targetNumber)
{
vote--;
}
else
{
vote++;
}
}
}
//如果需要判断此元素是不是众数
int count = 0;
for (int number : nums)
{
if (number == targetNumber) count++;
}
return count > nums.size() / 2 ? targetNumber : -1;
}
};
拓展 数组中出现次数超过n/k的数字,要求时间复杂度o(n),空间复杂度o(n).
睿仔,自己想想吧