基础算法分析实现

算法 - 数组主元素(出现次数超过一半的元素)

2022-07-29  本文已影响0人  erlich

题目:

举个例子

数组:[1, 5, 1, 8, 1, 2, 1, 1, 3, 1]

包含6个1,出现次数超过了半数5

1就是主元素

数组:[1, 5, 9, 8, 1, 2, 1, 1, 3, 1]

包含5个1,出现次数不超过半数5

没有主元素

分析

主要逻辑包含两个要点

最直观的思路 - 字典存储统计次数

用字典把元素当作key,value存储出现的次数

但是有需要遍历所有的存储key,比较各自出现次数大小

取巧部分

key - 主元素,默认取数组第一个当作key

反正需要统计次数

则在首次遍历数组的过程中,就统计count

我们可以不用统计具体每个元素出现的次数,既然主元素的出现次数超过 一半

这种方式比之前的字典方式,省去了空间复杂度

实现

void checkKeyElement(int array[], int n) {
    int count = 0;
    int key = array[0];
    
    for (int i = 0; i < n; i++) {
        if (array[i] == key) {
            count++;
        } else {
            if (count > 0) {
                count--;
            } else {
                key = array[i];
                count = 1;
            }
        }
    }
    
    if (count < 1) {
        printf("数组中不存在主元素\n");
        return;
    }
    count = 0;
    for (int i = 0; i < n; i++) {
        if (array[i] == key) {
            count++;
        }
    }
    if (count <= n / 2) {
        printf("数组中不存在主元素\n");
        return;
    }
    printf("数组中存在主元素 %i\n", key);
}
上一篇下一篇

猜你喜欢

热点阅读