Weiss-(DSAA - in C,2.19) 大小为N的数组A,其主要元素出现次数超过N/2
2016-10-15 18:57
302 查看
/* 大小为N的数组A,其主要元素是一个出现次数超过N/2的元素(这样的元素只有一个) 算法概要: 第一步: 找出主要元素的一个候选元(这是难点)。这个候选元是唯一有可能是主要元素的元素。 第二步: 确定是否这个候选元是主要元素。 为了找出候选元,构造第二个数组B。 比较A1和A2,如果它们相等则取其中之一加到数组B中;否则什么都不做; 然后比较A3和A4,按同样的方式处理,其次类推直到读完这个数组, 然后递归的寻找数组B中的候选元,它也是A的候选元. (为什么?) a, 递归如何终止? b, 当N是奇数时, 如何处理? c, 该算法的运行时间是多少? d, 我们如何避免使用附加数组B? e, 编写一个程序求解主要元素. */
int findMainNum(vector<int> &A)
{
vector<int> B; //候选数组
if(A.empty())
return -1;
else if(A.size() == 1)
return A[0];
for(int i = 0; i < A.size(); i += 2)
if(A[i] == A[i+1] && i+1 < A.size())
B.push_back(A[i]);
int res = findMainNum(B); //递归,将问题规模缩小
if(isMainNum(A,res))
return res == -1? A.back() : res; /* 1*/
else
return -1; //没有找到这样的元素
}
bool isMainNum(vector<int> &A,int res)
{
int count = 0;
int s = res == -1? A.back() : res; //有候选元素使用res,无就使用最后一个元素 /* 2*/
<pre name="code" class="cpp">
for(int i = 0; i < A.size(); i++)
if(A[i] == s) count++; if(count >= A.size()/2 + 1) return true; else return false;}
解释一下 : /* 1*/ 和 /* 2*/
/* 若isMainNum(A,res)为真 则有两种情况: 1.res == -1 ,无候选元素,此时应返回 A[]最后一个元素, s = A.back(); 2.res != -1 ,有候选元素,此时应返回 res, s = res; */
相关文章推荐
- 大小为N的数组A,其主要元素是一个出现次数超过N/2的元素。找出主要元素。
- 求数组中出现次数超过数组长度一半的元素
- 程序员面试题目总结--数组(三)【旋转数组的最小数字、旋转数组中查找指定数、两个排序数组所有元素中间值、数组中重复次数最多的数、数组中出现次数超过一半的数】
- Swift按照数组元素出现的次数及大小排序
- 广联达笔试,找整形数组中出现次数超过n/2的元素
- 算法 n大小的数组中找出出现3/n次数以上的元素
- 查找数组中出现次数超过一半的元素
- 找出数组中出现次数超过一半的元素
- 寻找大小为n的数组中出现次数超过n/2的那个数 (美团面试题)
- 找出出现次数超过数组一半元素的数
- 求数组中出现次数超过一半的元素
- 求数组中出现次数超过一半的元素(《编程之美》寻找水贴王问题)C代码
- 数据结构面试题总结2——数组:求出现次数超过一半的元素
- 找出数组中出现次数超过一半或者超过1/3的元素
- 找出数组中出现次数超过数组长度一半的元素
- 在一个整型数组中有一个元素的出现次数超过了数组长度的一半,试设计一个 在时间上尽可能高效的算法,找出这个元素。
- 每日一题:求数组中出现次数超过一半的元素
- 剑指Offer:找出数组中出现次数超过一半的元素
- Swift按照数组元素出现的次数及大小排序
- Swift按照数组元素出现的次数及大小排序