【leetcode】229. Majority Element II

题目:

Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. The algorithm should run in linear time and in O(1) space.

翻译:

找出数组中出现次数大于⌊ n/3 ⌋的所有数字。

思路:

数组中出现次数大于n/3的数字最多不超过两个,所以只要记录这两个数字以及它们的的出现次数就行,(num1,count1),(num2,count2)。具体做法先从头遍历这个数组,如果nums[i]等于num1或num2那么对应的count就自加。如果没有上述情况,再看count1和count2中有没有是0的,有的话将nums[i]赋值给对应的num1或num2,然后将count1或count2赋值为1。如果以上情况均没有出现,那么将count1和count2分别减1。

结束上述过程之后,再遍历一遍数组,找到num1和num2的出现次数。判断是否大于n/3返回即可。

代码:

class Solution {
public:
	vector<int> majorityElement(vector<int>& nums) {
		int v_size=nums.size();
		vector<vector<int>> result;
		vector<int> majority;
		bool insert_flag=false;
		result.resize(2);result[0].resize(2,0);result[1].resize(2,0);	
		for (int i=0;i<nums.size();i++)
		{
			for (int j=0;j<result.size();j++)
			{
				if (result[j][0]==nums[i])
				{
					result[j][1]++;
					insert_flag=true;
					break;
				}
			}
			for (int j=0;j<result.size() && !insert_flag;j++)
				if (result[j][1]==0)
				{
					result[j][0]=nums[i];result[j][1]=1;
					insert_flag=true;
					break;
				}
			if (!insert_flag)
			{
				for (int j=0;j<result.size();j++)
					result[j][1]--;
			}
			insert_flag=false;
		}
		result[0][1]=0;result[1][1]=0;
		for (int i=0;i<nums.size();i++)
		{
			for (int j=0;j<result.size();j++)
				if (result[j][0]==nums[i])
				{
					result[j][1]++;
					break;
				}
		}
		
		for (int j=0;j<result.size();j++)
		{
			if (result[j][1]>floor((float)v_size/3))
			{
				majority.push_back(result[j][0]);
			}
		}
		return majority;
	}
};

结果:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值