找出出现次数超过一半的元素
2013-07-18 13:22
239 查看
大小为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; }
相关文章推荐
- 找出数组中出现次数超过数组长度一半的元素—-腾讯
- 找出出现次数超过数组一半元素的数
- 剑指Offer:找出数组中出现次数超过一半的元素
- 找出数组中出现次数超过数组长度一半的元素
- Java实现 找出数组中出现次数超过数组长度一半的元素
- 笔试算法题(24):找出出现次数超过一半的元素 & 二叉树最近公共父节点
- 在一个整型数组中有一个元素的出现次数超过了数组长度的一半,试设计一个 在时间上尽可能高效的算法,找出这个元素。
- 找出数组中出现次数超过一半或者超过1/3的元素
- 找出整数数组中出现次数超过数组长度一半的元素(Java)
- 找出数组中出现次数超过一半的元素
- 找出一个数组中出现次数超过一半的元素
- 数组中有一个数字出现的次数超过了数组长度的一半,找出这个数
- C++数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。(牛客剑指offer)
- 找出数组中出现次数超过一半的数
- 找出数组中出现次数超过数组长度一半的数
- O(NlogN)复杂度选取出现次数超过一半的元素(递归版本)
- 现在有一个数组,已知一个数出现的次数超过了一半,请用O(n)的复杂度的算法找出这个数。
- 已知一个数出现的次数超过了一半,请用O(n)的复杂度的算法找出这个数
- 22.数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果
- 程序员面试题目总结--数组(三)【旋转数组的最小数字、旋转数组中查找指定数、两个排序数组所有元素中间值、数组中重复次数最多的数、数组中出现次数超过一半的数】