LintCode 第46题 主元素 【贪心算法】

题目描述:

给定一个整型数组,找出主元素,它在数组中的出现次数严格大于数组元素个数的二分之一。

样例

给出数组[1,1,1,1,2,2,2],返回 1

解题思路:

这道题属于贪心算法,解法有多种,关键是找到最优解。

最容易让人想到的解法就是遍历然后统计元素的个数,然后得出来最大的就是要找的主元素。但是这个效率低,最优的解法是将数组的元素分为两类,一类是主元素,另一类是非主元素,声明count计数变量和result,if(count == 0)则将数组[i]元素赋值给result,result元素和数组[i]值做比较,如果相等count++,否则count--,也就是把当前两个不相等的值拿走,这两个可能都是非主元素,也可能一个是主元素另一个不是,但是最终遍历结束result存储的一定是主元素的值。

时间复杂度O(N)。一次遍历就够了。

实现代码:

int selectMajorityNumber(int *a,int length){
    int result = 0;
    int count = 0;
    for (int i = 0; i<length; i++) {
        if (count == 0) {
            result = a[i];
            count++;
        } else {
            if (a[i] != result) {
                count--;
            } else {
                count++;
            }
        }
    }
    return result;
}

int main(int argc, const char * argv[]) {
    // insert code here...
    std::cout << "Hello, World!\n";
    
    int a[5] = {1,3,3,3,4};
    int value = selectMajorityNumber(a, 5);
    
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值