Leetcode169 求众数 C++

方法一:
思路:摩尔投票法。先将第一个数字假设为众数,然后把计数器设为1,比较下一个数和此数是否相等,若相等则计数器加一,反之减一。然后看此时计数器的值,若为零,则将下一个值设为候选众数。以此类推直到遍历完整个数组,当前候选众数即为该数组的众数。(这种方法的前提是数组中一定有众数的存在)。

	int ans, count = 0;
		for (int num : nums)
		{
			if (count == 0)
			{
				ans = num; ++count;
			}
			else
				if (num == ans) ++count;
				else --count;
		}
		return ans;

方法二:
思路:位操作法。
每次统计每位上出现次数超过n/2的数是0还是1,最后将每位上的数合并即为众数。

class Solution {
public:
    int majorityElement(vector<int>& nums) {
     		int ans=0,n=nums.size();
		for (int i = 0; i < 32; ++i)
		{
			int one = 0, zero = 0;
			for (int num : nums)
			{
				if (one>n / 2 || zero > n / 2) break;
				if (num&(1 << i))++one;
				else ++zero;
			}
			if (one > zero) ans |= (1 << i);
		}
		return ans;
        
    }
};
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值