2013年的408算法题

0 结果

在这里插入图片描述

在这里插入图片描述

1 题目

2 思路

思路一:
使用hash映射打表,每出现一次次数加1,如果次数有超过n/2,则存在主元素,反之,则不存在。(缺点:需要辅助数组)
思路二:
两两相互抵消。如果数组中存在大于一般的相同元素,首先假设第一个元素为主元素的候选元素【统计个数为1】,如果目前元素统计的个数大于0,遇到相同的数字——个数加1,不同的数字——个数减1;当元素统计的个数为0时,将遇到的数字变更为候选的主元素。循环结束时,遍历整个数组来统计候选主元素在数组中的个数,如果大于n/2,则存在主元素,反之则不存在。

3 实现

#include <cstdio>
#include <cstdlib>

const int n = 8;

int Func(int A[], int n){
    int num = A[0], cnt = 1;
    for (int i = 1; i < n; ++i) {
        if(A[i] == num){
            cnt++;
        }else{
            if(cnt > 0){
                cnt--;
            }else{
                num = A[i];
                cnt = 1;
            }
        }
    }
    cnt = 0;
    for (int j = 0; j < n; ++j) {
        if(num == A[j]){
            cnt++;
        }
    }
    if(cnt > n/2){
        return num;
    }else{
        return -1;
    }
}

int main(){
    int A[] = {0,5,5,3,5,1,5,7};//{0,5,5,3,5,7,5,5};
    printf("A:");
    for (int i = 0; i < n; ++i) {
        printf("%d ", A[i]);
    }
    printf("\n%d", Func(A, n));

    return  0;
}

时间复杂度:O(n)
空间复杂度:O(1)

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 岁月 设计师:pinMode 返回首页