数据结构与算法分析2.19题

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

分析:这道题在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;
}

你可能感兴趣的:(数据结构与算法分析)