列表

详情


SH12. 第二大的数

描述

输入n个整数,查找数组中第二大的数

输入描述

第一行n表示n个数,第二行n个空格隔开的数

输出描述

输出第二大的数

示例1

输入:

5
1 2 3 4 5

输出:

4

原站题解

C 解法, 执行用时: 2ms, 内存消耗: 200KB, 提交时间: 2021-09-10

#include <stdio.h>

//index要调整的结点  n是总共结点数 
void reHeap(int arr[],int index,int n){
	int child = 2*index+1;
	int key = arr[index];//需要调整的结点的元素 
	while(child<n){//叶子结点存在 
		if(child+1<n && arr[child] < arr[child+1]){//右孩子存在且比左孩子大 
			++child;	
		} 
		//child记录孩子中更大的那个结点下标
		if(key<arr[child]){
			arr[index] = arr[child];//把孩子的元素放在父结点处 
			index = child;
			child = 2*index+1;
		}else{
			break;
		}
	} 
	arr[index] = key;
} 
//时间复杂度是O(nlogn)  空间复杂度O(1)  不稳定 
void heapSort(int arr[],int n){
	//把完全二叉树调整成大根堆
	int i;
	for(i=n/2;i>=0;--i)//第一个非叶子结点 n/2   从下往上调整 
		reHeap(arr,i,n); 
	for(i=0;i<n-1;i++){//循环进行n-1次
		//arr[0]和arr[n-1-i]最后一个元素交换 
		int tmp = arr[0];
		arr[0] = arr[n-1-i];
		arr[n-1-i] = tmp;
		//不考虑最后一个元素的基础上,重新调整成大根堆  只需要调整0结点 
		reHeap(arr,0,n-1-i);
	}
}

int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        int arr[n];
        int index=0;
        while(index<n)
        {
            if(scanf("%d",&arr[index++])==EOF)
                break;
        }
        heapSort(arr,index);
        printf("%d\n",arr[index-2]);
    }
    return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 256KB, 提交时间: 2020-11-30

#include<stdio.h>
#include<stdlib.h>
int main()
{
  int a[1000];
  int i,j,n,temp;
  scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    for(i=0;i<n-1;i++)
    {
        for(j=0;j<n-i-1;j++)
        {
            if(a[j]>a[j+1])
            {
                temp=a[j];
                a[j]=a[j+1];
                a[j+1]=temp;
            }
        }
    }
    printf("%d",a[n-2]);
    return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 256KB, 提交时间: 2019-03-23

#include<stdio.h>
#include<stdlib.h>

int main(){
    int n,i,j,*a,temp;
    scanf("%d",&n);
    a=(int *)malloc(sizeof(int)*n);
    for(i=0;i<n;i++){
        scanf("%d",&a[i]);
    }
    for(i=0;i<n;i++)
        for(j=i;j<n;j++)
            if(a[j]>a[i])
            {
                temp=a[j];
                a[j]=a[i];
                a[i]=temp;
            }
    
    for(i=1;i<n;i++){
        if(a[i]<a[0]){
            printf("%d",a[i]);
            break;
        }
        if(i==9)
            printf("%d",a[i]);
    }
    return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 312KB, 提交时间: 2022-03-05

#include<stdio.h>
#include<stdlib.h>
int main()
{
int i,j,k,num,*p,temp;
 scanf("%d",&num);
    p=(int*)malloc(sizeof(int)*num);
    for(i=0;i<num;i++)
        scanf("%d",&p[i]);
    for(i=0;i<num-1;i++)
    {
        k=i;
        for(j=i+1;j<num;j++)
        {
           if(p[k]<p[j])
               k=j;
        }
        if(k!=i)
        {
            temp=p[k];
            p[k]=p[i];
            p[i]=temp;
        }
    }
    printf("%d",p[1]);
    return 0;
    
}

C 解法, 执行用时: 2ms, 内存消耗: 348KB, 提交时间: 2022-04-21

/*
#include <stdio.h>

int find_sec_max(int arr[],int n)
{
    int max1,max2;
    max1 = arr[0];
    max2 = 0;
    int i,x;
    for(i = 0;i < n;i ++)
    {
        if(arr[i] >= max1)
        {
            max1 = arr[i];
        }
    }
    for(i = 0,x = 0;i < n;i ++)
    {
        if(arr[i] >= max2 && arr[i] < max1)
        {
            max2 = arr[i];
            x ++;
        }
        
    }
    if(x == 0)
    {
        max2 = max1;
    }
    
    return max2;
}
int main()
{
    int data[100];
    int n = 0;
    int i = 0;
    scanf("%d",&n);
    while( scanf("%d",&data[i++]) != EOF)
    {}
    printf("%d\n",find_sec_max(data, n));
    return 0;
}
*/
#include <stdio.h>

int n,x,max,max2;

int main()
{
	int i=0;
	scanf("%d",&n);
	while(scanf("%d",&x)!=EOF)
		if(x>max)
		{
			max2 = max;
			max = x;
		}
		else if(x>max2)
			max2 = x;
	printf("%d\n",max2);
	return 0;
}

上一题