LeetCode 4 :Majority Element

problem:Given an array of size n, find the majority element. The majority element is the element that appears more than ⌊ n/2 ⌋ times.

problem analysis:

1.首先,需要统计数组元素出现的次数,包括不同的元素有几个?每一个不同的元素出现了几次?同时需要将不同的元素及出现的频率正确对应。

2.在第一步完成之后,可以寻找最大的频率数,然后找到majority element。

代码写的有点乱,有待优化。

class Solution
{
public:    
        int majorityElement(vector<int> &num) 
        {
            vector<int> elemFre;
            vector<int> elemCount(num.size(), 0);
            int vecSize = num.size()/2;
            int tempInt = 0;
            int vecPos = 0;
            int noMatchNum = 0;
            int elemSize = 0;
            for(vector<int>::iterator iter=num.begin(); iter!=num.end(); ++iter)
            {
                if(iter == num.begin())
                {
                    elemFre.push_back(*iter);
                }
                for(vector<int>::iterator iterFre=elemFre.begin(); iterFre!=elemFre.end(); ++iterFre)
                {
                    if((*iter) == (*iterFre))
                    {
                        elemCount[noMatchNum] += 1;
                    }
                    else
                    {
                        ++noMatchNum;
                        continue;
                    }
                }
                elemSize = elemFre.size();
                if(noMatchNum == elemSize)
                {
                    elemFre.push_back(*iter);
                    elemCount[noMatchNum] += 1;
                }
                noMatchNum = 0;
            }
            vecPos = 0;
            for(vector<int>::iterator iter=elemCount.begin(); iter!=elemCount.end(); ++iter,++vecPos)
            {
                if((*iter) > vecSize)
                {
                    tempInt = elemFre[vecPos];
                }
                else
                {
                    continue;
                }
            }
            return tempInt;
        }
};


第一个两重for循环建立一个元素及其频率的对应表,elemFre存储的是num中不同的元素,elemCount存储的是elemFre里面元素出现的频率。

1.第一次循环,把第一个元素添加到elemFre,进入内层循环中。

2.内层循环,遍历elemFre中的所有元素,分两种情况:a,num中的元素在elemFre中找到了对应项,则对应的频率数组elemCount[noMatchNum]+1;否则noMatchNum+1.直到将elemFre中所有的元素都遍历完。

3.循环结束后,noMatchNum中应该存放的是与当前元素都不同的之前出现的元素数目,或者是当前元素在elemFre中的对应项前面的元素数目。

4.在上面的基础上判断noMatchNum ==  elemFre.size(),如果相等,则说明新到元素需要添加到elemFre中,并且对应的频率数+1,具体完成这一操作的是

      if(noMatchNum == elemSize)
                {
                    elemFre.push_back(*iter);
                    elemCount[noMatchNum] += 1;
                }
                noMatchNum = 0;

这样通过上面的操作完成的不同元素的提取,和对应频率数目的统计工作。

5.通过以上操作,在遍历一次elemCount,找到最大的频率数并返回对应的元素即可。

总计:逻辑思维不够,思维不严谨,变量的最终结果意义不明确,浮躁。

我这个方法肯定不是最好的,欢迎大家推荐优化的算法。

原文地址:https://www.cnblogs.com/bestwangjie/p/4180773.html