leetcode|169-Majority Element

题目描述:

给定一个大小为 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的,并且给定的数组总是存在众数。

示例 1:

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

示例 2:

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

解题思路:

1. 初始化majorityIndex,并且维护其对应count;

2. 遍历数组,如果下一个元素和当前候选元素相同,count加1,否则count减1;

3. 如果count为0时,则更改候选元素,并且重置count为1;

4. 返回A[majorityIndex]

原理:如果majority元素存在(majority元素个数大于n/2,个数超过数组长度一半),那么无论它的各个元素位置是如何分布的,其count经过抵消和增加后,最后一定是大于等于1的。 如果不能保证majority存在,需要检验。 复杂度:O(N)

 Attention: 循环时从i = 1开始,从下一个元素开始,因为count已经置1


代码如下:

class Solution
{
public:
	int majorityElement(vector<int>& nums)
	{
		int elem = 0;//初始化元素和元素的个数都是0
		int count = 0;
		int size = nums.size();
		for (int i = 0; i < size; i++)
		{
			if (count == 0)
			{
				elem = nums[i];//这里相当于当前的候选元素
				count = 1;
			}
			else
			{
				if (elem == nums[i])
				{
					count++;
				}
				else
					count--;//如果count变成了0之后,elem选择重新
			}
		}
		return elem;
	}
};

猜你喜欢

转载自blog.csdn.net/linqianbi/article/details/80378195