求最大值、次大值和第三大值

求最大、次大和第三大的值

本题目要求读入n个整数,要求用最少的比较次数,输出它们的最大值、第2大的值和第3大的值。例如,对于13 13 1 10 34 10这6个数,最大值为34,第2大的值为13,第3大的值为10。

输入格式:

输入有两行。第一行为整数个数n(≤1 000 000),第二行给出n个以空格分隔的整数。

输出格式:

对每一组输入,在一行中输出最大值、第2大的值和第3大的值值,中间以一个空格分隔,但行尾没有多余空格。
如果输入数据不足三个,则输出“Invalid Input”。
如果没有第3大的值,则输出“There is no third largest element”。
如果没有第2大和第3大的值,则输出“There is no second largest and third largest element”。

输入样例:

6
13 13 1 10 34 10 

输出样例:

34 13 10 

第一眼看到这道题纠结了好久,题目中说用最少的比较次数来完成。既然求三个值,脑子中的第一反应是遍历,但出现了一个错误想法,即遍历的时间复杂度是O(N3),其实不然,它只是分三次进行遍历,时间复杂度仍为O(N),代码如下:

代码块:

#include<stdio.h>
#include<stdlib.h>
# define MAXSIZE 100000000
#define NUMSIZE -10000000 //宏定义最大值、次大值和第三大值的初始值
int main(){
    int *a=(int *)malloc(MAXSIZE*sizeof(int));//动态申请数组
    int i;
    int n;//数组的长度
    scanf("%d",&n);
    //输入元素个数少于3个,不符合题目要求
    if(n<3){
        printf("Invalid Input");
        return 0;
    }
    for(i=0;i<n;i++){
        scanf("%d",&a[i]);
    }

    int first=NUMSIZE;//最大值
    int second=NUMSIZE;//次大值
    int third=NUMSIZE;//第三大值
    //找最大值,如果数组中第i个元素的值大于first,则更新first的值
    for(i=0;i<n;i++){
        if(first<a[i]){
            first=a[i];
        }
    }
    //找次大值,同上
    for(i=0;i<n;i++){
        if(second<a[i]&&a[i]!=first){
            second=a[i];
        }
    }
    if(second==NUMSIZE){
        printf("There is no second largest and third largest element");
        return 0;
    }
    //找第三大值
    for(i=0;i<n;i++){
        if(third<a[i]&&a[i]!=first&&a[i]!=second){
            third=a[i];
        }
    }
    if(third==NUMSIZE){
        printf("There is no third largest element");
        return 0;
    }

    printf("%d %d %d",first,second,third);
    free(a);//释放内存
    return 0;
}

程序比较简单,问题在于卡在了时间复杂度上,总觉得它的时间复杂度是O( N 3 N^3 N3),想错了,哦NO!!!

### 回答1: 可以使用一个变量来记录输入的整数最大值,然后依次输入每个整数,如果当前输入的整数比记录的最大值还要大,就更新最大值。最后输出记录的最大值即可。 示例代码: ``` max_num = None # 记录最大值的变量,初始值为 None n = int(input("请输入整数个数:")) for i in range(n): num = int(input("请输入一个整数:")) if max_num is None or num > max_num: max_num = num print("最大值是:", max_num) ``` ### 回答2: 要解决这个问题,需要对输入的若干整数进行比较,找到其最大的一个数。而在编程,要实现这个过程需要借助循环和条件语句。 具体的步骤如下: 1. 首先需要获取输入的整数列表,可以使用input()函数获取控制台输入,也可以从文件或其他数据源读取; 2. 为了能够进行比较,需要定义一个变量用于存储目前找到的最大值,可以将其初始化为列表的第一个数; 3. 使用for循环遍历整数列表,每遇到一个新的数,就与当前最大值进行比较,如果比当前最大值大,则更新最大值; 4. 遍历完整数列表后,最大值就是我们需要输出的结果。 下面是一个Python示例代码: ```python nums = list(map(int, input().split())) # 获取输入的整数列表 max_num = nums[0] # 初始化为第一个数 for num in nums: if num > max_num: max_num = num # 更新最大值 print(max_num) # 输出结果 ``` 需要注意的是,这个代码假设输入的整数已经存储在一个列表了,每个数之间用空格分隔。如果输入方式不同,需要做出相应的调整。此外,为了使代码更健壮,还需要加入一些异常处理的逻辑,例如检查输入的是不是整数等。 ### 回答3: 本题需要使用编程语言对一组整数进行输入,并输出这组整数最大值。考虑使用循环结构,逐个读入每个数,并与之前读入的数进行比较,找出其最大值。 具体实现思路如下: 首先,定义一个变量max,用来保存当前已经读入的整数最大值。将其初始化为任意一个较小的数,比如-10001。 然后,使用循环结构读入各个整数,并逐个将其与max比较,如果当前读入的数大于max,则将max更新为当前数。 最后,循环结束后,max即为这组整数最大值。将其输出即可。 下面是示例代码(Python语言): max = -10001 # 初始化为一个较小的数 n = int(input("请输入整数的数量:")) for i in range(n): x = int(input("请输入第%d个整数:" % (i+1))) if x > max: max = x print("最大值为:%d" % max) 需要注意的是,以上代码仅为示例,实际上需考虑多种情况,比如输入的数不合法,或者输入的数超出了题目要的绝对值范围。在实际应用,还需要进行相应的错误处理和边界判断,以确保程序能够正确运行。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值