zoukankan      html  css  js  c++  java
  • 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,找到最大的频率数并返回对应的元素即可。

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

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

  • 相关阅读:
    让eclipse中选中的变量以指定颜色高亮显示
    IDirect3DDevice9::DrawPrimitive
    3D中的切线空间简介(转)
    Scenario 3: Drawing One Triangle with Indexing
    Scenario 2: Drawing Two Triangles with Indexing
    aswing学习笔记
    aswing学习笔记4通过调用面板中的按钮实现主界面动态切换皮肤的问题!
    flexBuilder3中生成的模板页不支持flash全屏的修改办法
    Eclipse和FlexBuilder中设置编辑代码高亮
    aswing学习笔记2不规则外框请教思路
  • 原文地址:https://www.cnblogs.com/bestwangjie/p/4180773.html
Copyright © 2011-2022 走看看