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

来源:互联网 发布:linux如何打开pdf文件 编辑:程序博客网 时间:2024/06/16 05:51

题目描述:

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

样例

给出数组[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;}


原创粉丝点击