多数元素

题目: 给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例:
示例 1:

输入: [3,2,3]
输出: 3

示例 2:

输入: [2,2,1,1,1,2,2]
输出: 2

思路1: 排序找中间的值。
在这里插入图片描述
通过上图的分析,我们可以发现不管是数组元素个数是奇数还是偶数,次数大于n/2的元素都会在n/2位置上。所以代码如下:
代码1:

int majorityElement1(vector<int>& nums)
{
	sort(nums.begin(),nums.end());
	return nums[nums.size()/2];
}

思路2: 保存数组每个元素出现的次数,最后判断出现次数是否大于n/2即可。用哈希和数组都可以。我们用unordered_map<int,int>hash来记录。
代码2:

int majorityElement2(vector<int>& nums)
 {
	 unordered_map<int,int> record;
	 for(int i=0;i<nums.size();i++)
	 {
		 record[nums[i]]++;
		 if(record[nums[i]]>nums.size()/2)
		 {
			 return nums[i];
		 }
	 }
	 return -1;
 }

思路3: 投票法:和我一样的加1,不一样的减一,当票数<0则换下一个,最后留下来的就是众数,如下图举例:
在这里插入图片描述
代码:

int majorityElement (vector<int>& nums)
 {
	 int cand=nums[0];
	 int count=1;
	 for(int i=1;i<nums.size();i++)
	 {
		 if(nums[i]==cand)
		 {
			 count++;
		 }
		 else if(--count<0)
		 { 
			 cand=nums[i];
			 count=1;
		 }
		
	 }
	 return cand;

 }

加油哦!🍰。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值