寻找数组的主元素问题的解法
2016-09-02 20:49
211 查看
所谓主元素, 就是指在数组中出现次数超过N/2的元素, 给出大小为N的数组, 判断是否存在主元素, 若存在,求出主元素.
我的思路
BF解法就不讲了, 我一开始想到的是如果这组数组中数字的范围够小, 或者数字的类型够少, 完全可以用一个数组来记录各个数字出现的次数, 然后再遍历一次即可找出出现次数最多的, 最后判断这个次数是否超过了N/2, 这样算的话, 只需要O(N)的时间复杂度, 这也是典型的用空间换时间. 如果数字足够多, 范围足够大, 那就只能快排了, 排完之后这个题目其实也就是转化成了我说的上一种方式.聪明人的解法(来源于网络)
首先我们来分情况, 假设这个元素存在的话, 我们先假设数组中第一个元素是该元素, 然后计数变量初始化为1, 此时从第二个元素开始遍历数组, 如果接下来这个元素是当前假定的主元素,那么计数变量+1, 否则计数变量-1, 当计数器数量即将要下降到0的时候, 将当前位置的元素设为主元素, 计数变量重新刷新为1. 那么一条很重要的属性就是遍历数组结束的时候的假定主元素就是该数组的首元素. 此时我们再假设这个元素可能不存在, 那么其实我们只需要确定我们刚才求出来的最后一个假定元素是不是主元素就可以了. 代码实现非常简单, 但其实要想到这个算法, 就不是这么容易了, 哎, 反正我是想不到...int findMainElement(const int* array, size_t size) { int candidate = array[0]; int counter = 1; for (int i = 1; i < size; ++i) { if (candidate == array[i]) { ++counter; } else if (counter == 1) { candidate == array[i]; } else { --counter; } } counter = 0; for (int i = 0; i < size; ++i) { if (candidate == array[i]) { ++counter; } } if (counter * 2 > size) { return candidate; } else { return -1; } }
相关文章推荐
- 求数组中出现次数超过一半的元素(《编程之美》寻找水贴王问题)C代码
- 寻找数组中的第K大的元素,多种解法以及分析
- 在数组中寻找主要元素的算法及其正确性证明。
- 寻找必败态——一类博弈问题的快速解法
- 八皇后问题一维数组解法
- 编程之美寻找数组中的最大值和最小值以及扩展问题
- 数组的众数问题的分治解法
- 寻找必败态——一类博弈问题的快速解法
- 寻找特定数目元素的中间元素及排序相关问题
- 寻找必败态——一类博弈问题的快速解法
- RMQ问题的树状数组解法
- 最长公共子串问题的后缀数组解法
- 寻找必败态——一类博弈问题的快速解法
- 有两个字符串数组a和b,寻找相同元素 (a和b都比较大)
- 如何删除动态数组的指定元素 - 回复 "Splendour" 的部分问题
- 主元素问题(判断数组是否出现主元素,O(n)时间内找出主元素,主元素出现次数)
- 请教一个算法问题,有两个数组A,B,判断A中是否至少有一个元素和B中元素相同
- 寻找必败态:博弈问题的快速解法
- 寻找在数组中一个元素是不是该行最小,该列最大的元素
- 最长公共子串问题的后缀数组解法