求解数组中的主元素

原题:《数据结构与算法分析C++描述(第三版)》练习2.26

问题描述:大小为N的数组的主元素是出现次数超过N/2的元素。找到给定数组的主元素,若没有,应指出。

完整代码:

 1 #include<iostream>
 2 #include<vector>
 3 
 4 using namespace std;
 5 
 6 void cand(vector<int> &v)
 7 {
 8     vector<int>::iterator itf = v.begin();
 9     vector<int>::iterator ite = v.begin();
10     while(itf!=v.end()&&ite!=v.end())
11     {
12         if(*itf==*ite)
13         {
14             itf=v.erase(ite);
15             ite=itf+1;
16         }
17         else
18         {
19             itf=v.erase(itf,ite);
20             ite=itf+1;
21         }
22     }
23     if(itf!=v.end()&&v.size()>1) v.erase(itf);
24     if(v.size()>2) cand(v);
25 }
26 int mainem(vector<int> v)
27 {
28     int len=v.size();
29     vector<int> v1(v);
30     cand(v1);
31     int len1=v1.size();
32     int count;
33     if(len1>0)
34     {
35         for(int i=0;i<len1;i++)
36         {
37             count=0;
38             for(int j=0;j<len;j++)
39             {
40                 if(v[j]==v1[i]) count++;
41             }
42             if(count>len/2) return v1[i];
43         }
44     }
45     if(len%2==1)
46     {
47         count=0;
48         for(int i=0;i<len;i++)
49         {
50             if(v[i]==v[len-1]) count++;
51         }
52         if(count>len/2) return v[len-1];
53     }
54     return -1;
55 }
56 
57 int main()
58 {
59     int x;
60     vector<int> v;
61     while(cin>>x)
62         v.push_back(x);
63     int result=mainem(v);
64     if(result>0)     cout<<"main element:"<<result<<endl;
65     else cout<<"no main element"<<endl;
66     return 0;
67 }

 

注:为方便,将未找到主元素的返回值设为-1,所以测试使用正数数组。

 

转载于:https://www.cnblogs.com/moren/p/3659668.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个基于分治思想的求解n元素数组中最大元素的位置的算法的伪代码: ``` def find_max_index(array, start, end): if start == end: return start else: mid = (start + end) // 2 left_max_index = find_max_index(array, start, mid) right_max_index = find_max_index(array, mid+1, end) if array[left_max_index] >= array[right_max_index]: return left_max_index else: return right_max_index ``` 该算法的基本思想是将数组分成两个部分,分别递归求解每个子数组的最大元素,然后将两个子数组的最大元素进行比较,返回较大者的下标作为整个数组的最大元素的下标。 对于问题1,如果数组中的若干个元素都具有最大值,该算法的输出是不确定的,因为在比较过程中可能会选择其中一个最大值,而不是所有最大值。 对于问题2,建立该算法的键值比较次数的递推关系式如下: - 当n=1时,比较次数为0。 - 当n>1时,假设左右子数组的长度分别为n1和n2,则总比较次数为T(n) = T(n1) + T(n2) + 1。因为每次比较都可以将问题规模减半,所以n1和n2的最大值为n/2,因此有n1 + n2 = n,代入上式得到T(n) = T(n/2) + T(n/2) + 1 = 2T(n/2) + 1。 根据主定理,可以得到该算法的时间复杂度为O(nlogn)。 对于问题3,该分治算法的比较次数较蛮力算法要少,因为每次将问题规模减半,因此总比较次数为O(nlogn),而蛮力算法的总比较次数为O(n)。但是,该分治算法需要递归调用函数,因此需要额外的空间来存储每个递归调用的返回值,空间复杂度为O(logn),而蛮力算法的空间复杂度为O(1)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值