找出出现次数超过一半的元素

大小为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;
}

  

转载于:https://www.cnblogs.com/zxh1210603696/p/3198032.html

在没有额外存储空间的情况下找到出现次数超过一半的数是一个经典的计算机科学问题,通常使用“快速选择”或“三向切分”等在线算法,但这些都比较复杂。对于这个问题,更常见的做法是利用“摩尔投票法”(Majority Element),这个算法可以在O(n)的时间复杂度内解决,其中n是矩阵(数组)的长度。 以下是使用Python的一个简单示例,假设我们有一个二维矩阵(实际上是一维数组,因为矩阵通常是行主序访问),并假定我们知道元素都是非负整数: ```python def majority_element(matrix): if not matrix or len(matrix) == 0: return None num_elements = len(matrix[0]) count = [0] * (num_elements + 1) for row in matrix: for element in row: count[element] += 1 # 使用摩尔投票法,候选数初始为第一个元素 candidate, count_candidate = matrix[0][0], count[matrix[0][0]] # 更新候选数和计数,直到只有一个元素大于一半 for i in range(1, num_elements + 1): if count[i] > count_candidate: candidate, count_candidate = i, count[i] # 检查候选数是否满足超过一半的条件 for row in matrix: if row.count(candidate) != num_elements / 2: return None return candidate # 示例 matrix_example = [[1, 1, 1], [2, 2, 1], [3, 3, 2]] print(majority_element(matrix_example)) # 输出:2 或者 3(任意一个) ``` 注意,这个函数返回的是一个候选元素,如果矩阵中有多个元素出现超过半数,它只能返回其中一个。实际应用中,如果有多个这样的元素,并且你需要确定它们的具体位置,可能需要进一步分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值