请问是否有更高效的算法实现?

题目描述:
已知顺序存储结构的线性表L,其元素在表中有序排列,并且存在相同元素。编写高效算法,找出重复次数最多的数据元素并统计其重复次数,由参数返回该元素和重复次数。(若存在多个这样的元素,返回表中先出现的元素即可)

我的思路
遍历顺序表,一边遍历一边记录出现次数;

提问
是否有更为高效的算法?顺便附上算法代码,谢谢!

代码如下,如有帮助,请帮忙采纳一下,谢谢。

img

代码:


#include <stdio.h>
#define N 20
struct LinkList 
{
    int arr[N];
    int length;
};

//创建链表
void CreateList(struct LinkList *lst)
{
    int i,n;
    lst->length = 0;
    printf("请输入10个元素存入数组中");
    for (i=0;i<10;i++)
    {
        scanf("%d",&n);
        lst->arr[lst->length] = n;
        lst->length++;
    }
}
//查重,返回重复数最多的元素及个数
void GetRepeat(struct LinkList *lst,int *data,int *nmb)
{
    struct LinkList* p;
    int i=0;
    int cnt = 1;
    if(lst == 0) {data = 0;nmb = 0;return;}
    for (i=1;i<lst->length;i++)
    {
        if(lst->arr[i] == lst->arr[i-1])
            cnt++;
        else
        {
            if(cnt > *nmb)
            {
                *nmb = cnt;
                *data = lst->arr[i-1];
            }
            cnt = 1;
        }
    }
    if(cnt > *nmb)
    {
        *nmb = cnt;
        *data = lst->arr[i-1];
    }
}

//显示列表
void print(struct LinkList *lst)
{
    int i;
    printf("链表当前元素为:");
    for (i=0;i<lst->length;i++)
    {
        if(i<lst->length-1)
            printf("%d ",lst->arr[i]);
        else
            printf("%d\n",lst->arr[i]);
    }
}


int main()
{
    struct LinkList lst;
    int data,nmb=0;
    CreateList(&lst);
    print(&lst);
    GetRepeat(&lst,&data,&nmb);
    printf("重复最多的数是%d,重复次数%d",data,nmb);
    return 0;
}

你的思路没有问题,遍历一遍是肯定需要的

那能否提供较为详细的代码描述?

有序排列,存在重复,求最多
那么想更高效的话,不需要一个一个的去数,直接判断后面n个位置还是不是这个元素(n是当前最大个数),如果是,那么跳过n个继续数,并更新n
如果不是,二分法找到相同的元素,然后从这里继续遍历
这样多少能高效一些

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632