数据结构与算法分析2.19题

来源:互联网 发布:centos latex 编辑:程序博客网 时间:2024/06/06 00:44

问题描述:
编写一个程序求解主要元素。(何为主要元素:当某个元素在数组中出现的次数大于数组个数的一半时,该元素即为主要元素)。

分析:这道题在leetcode上出现过,思想是如果将主要元素摞成一摞,然后将非主要元素摞成另一摞,因为主要元素的个数要占数组个数的一半以上,所以,非主要元素的高度一定小于主要元素的高度。那么一层一层的往下削,削到最后时还剩下的一定是主要元素。

现在的困难是我们并不知道谁是主要元素(废话)。那我们可以假设某个元素为候选元素,那么从前向后遍历,如果某值与候选元素相同,引用计数加1,否则-1,这样当引用计数变成0时,表示候选元素选错了,要重选。然后假设下一个点为候选元素。试想一下如果该元素为非主要元素,那么最后它一定会被主要元素抵消掉。

但是这样得到的结果仅仅是候选项还不能确保一定是主要元素,所以还需要再走一遍来验证结果正确与否

代码如下:

int getMainData(int *nums,int size) {    if (size <= 0)        return -1;    int base = nums[0];    int baseCount = 1;    for (int i = 1; i < size; i++) {        if (baseCount == 0) {            base = nums[i];            baseCount = 1;        }        if (nums[i] != base)            baseCount--;        else            baseCount++;        }    //check if the real main data    int count = 0;    for (int i = 0; i < size; i++) {        if (nums[i] == base)            count++;    }    if (count > size / 2)        return base;    return -1;}
0 0
原创粉丝点击