数据结构与算法分析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;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值