zoukankan      html  css  js  c++  java
  • 找出出现次数超过一半的元素

    大小为N的数组A,其主要元素是一个出现次数超过N/2的元素(从而这样的元素只有一个或者不存在)
    算法:首先找出主要元素的一个候选元(难点)。这个候选元是唯一有可能是主要元素的元素。第二步确定是否这个候选元是主要元素。为了找出候选元,构造第二个数组B。比较A1和A2,如果它们相等则取其中之一加到数组B中;否则什么都不做;然后比较A3和A4,按同样的方式处理,其次类推直到读完这个数组,然后递归的寻找数组B中的候选元,它也是A的候选元。(PS:可以用A来代替B的作用从而避免使用附加数组)
    
    下面我的算法是使用了数组A来代替数组B
    //找出一个数组的主要元素的候选元,寻找过程中会改变数组的元素位置
    #include <iostream>
    using namespace std; 
    void Swap(int* a, int *b)
    {
         int temp = *a;
         *a = *b;
         *b = temp;
    }
    void PrintArray(int *array, int n)
    {
         if (n <= 0)
              return;
         cout<<"Array:";
         for (int i = 0; i < n; ++i)
         {
              cout<<array[i]<<" ";
         }
         cout<<endl;
    }
    int FindProbableMainCell(int *array, int n)//寻找候选元
    {
         if(n <= 1)
              return array[0];
         else
         {
              for(int i = 0, len = 0; i < n; i += 2)
              {
                   if(i == n - 1)//当n为奇数时,此时i指向最后一个元素,直接放入数组中
                   {
                        //array[len++] = array[i];
                        Swap(&array[len], &array[i]);
                        ++len;
                        return FindProbableMainCell(array, len);
                   }
                   if(array[i] == array[i+1])
                   {
                        //array[len++] = array[i];
                        Swap(&array[len], &array[i]);
                        ++len;
                   }
                   else if(array[i] != array[i+1])
                        ;// do nothing
                   if(i == n - 2)//当n为偶数时,此时上面的代码已经比较完最后两个元素因此可以直接递归寻找候选元
                        return FindProbableMainCell(array, len);
              }
         }
    }
    bool FindMainCell(int *array, int n, int cell)//确定候选元是否为主要元素
    {
         int num = 0;
         for(int i = 0; i != n; ++i)
         {
              if(array[i] == cell)
                   ++num;
         }
         if(num >= n / 2)
              return true;
         else
              return false;
    }
    int main(int argc, char const *argv[])
    {
         int x, len;
         cout<<"Please input len:"<<endl;
         cin>>len;
         int *array = (int*)new int [len];
         cout<<"Please input "<<len<<" numbers"<<endl;
         for(int i = 0; i != len; ++i)
         {
              cin>>x;
              array[i] = x;
         }    
         int cell = FindProbableMainCell(array, len);
         cout<<"The probable main cell is "<<cell<<endl;
         if(FindMainCell(array, len, cell))
              cout<<"The main cell is "<<cell<<endl;
         else
              cout<<"The array doesn't hold a main cell!!!"<<endl;
         delete [] array;
         return 0;
    }
    

      

  • 相关阅读:
    网络基础 03 交换机基本原理与配置
    网络基础 02 网络布线与数制转换
    C#操作excel(读取excel里的图片并show在页面上)
    让IIS支持中文文件名和目录
    Asp.net中防止用户多次登录的方法
    【转摘】一道关于实例化顺序的C#面试题
    选项卡调其他窗体方法
    同一个工作组的计算机能ping通不能访问对方共享资源
    Combobox出现System.Data.DataRowView的原因,以及指定ValueMember的时机问题
    无法嵌入互操作类型“Microsoft.Office.Interop.Excel.ApplicationClass”。请改用适用的接口。
  • 原文地址:https://www.cnblogs.com/zxh1210603696/p/3198032.html
Copyright © 2011-2022 走看看