169.求众数

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

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

示例 1:

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

示例 2:

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

1:

思路:遍历整个数组,用ret返回数组中出现最多的元素。

用count记录每个元素出现的次数。以[2,2,1,1,2,2]为例,遍历前两个数后,count==2,说明2为众数,用ret保存2.

扫描前4个数后,由于2和1出现次数相等,此时count==0;在扫描第五个数2的时候,又将count置为1。此时2为众数,以此类

推。 

 

int majorityElement(int* nums, int numsSize) {

    int i = 0,count=0,ret=0;

	while (i < numsSize)    
	{
		if (count == 0 || nums[i] == ret)   
		{
			count++;
			ret = nums[i];
		}
		else
			count--;
		
		++i;
	}
	return ret;
}

改进:考虑无众数的情况,如[2,2,3,3,1]

 

int majorityElement(int* nums, int numsSize)
{
	int ret = nums[0], count = 1, i;

	for (i = 1; i < numsSize; ++i)    //假设第一个数是众数,从第二个数开始遍历
	{
		if (nums[i] == ret) count++;   //用count记录元素出现次数
		else if (count > 0)			   //见1分析
			count--;
		else                           //如果出现count==0 && nums[i]!=ret,则需要重新开始计数
		{
			count = 1;
			ret = nums[i];
		}
	}
	if (count > 0)
		for (i = count = 0; i < numsSize; ++i)  //重新判断该数是否为众数
			if (nums[i] == ret) count++;

	if (count > numsSize / 2) return ret;
	return -1;
}

 

你可能感兴趣的:(LeetCode)