C++递归求数组最大最小值

题目链接

Description

给定n个数,在最坏情况下用╔ 3n/2-2 ╕次比较找出这n个数中元素的最大值和最小值。

要求只编写函数 

void maxmin(int a[],int low,int high,int *max,int *min).

系统会自动在程序的最后加上如下代码:

int main()
{
    int max,min,k,a[200];
    int m;
    while(scanf("%d",&k)&&k)
    {
        memset(a,0,sizeof(a));
        for(m=0;m<k;m++)
            scanf("%d",&a[m]);
        maxmin(a,0,k-1,&max,&min);
        printf("%d %d\n",max,min);
    }
}

Input

包含多组测试数据。每组测试数据的第一个元素是整数的个数n,接下来是n个整数。0表示结束。 n<=200

扫描二维码关注公众号,回复: 8804728 查看本文章

Output

这n个数中的最大值和最小值。

Sample Input

5 1 8 2 4 3
3 2 4 1
0

Sample Output

8 1
4 1

HINT

加上相应的头文件,并实现函数

思路:二分,先找左边的最大值和最小值,然后找右边最大最小值,最后两个最大值比较求最大,两个最小值比较求最小。

在做这个题的时候可能会遇到主函数中minn和maxx没有清0的问题,具体看代码(代码中有解释)。

#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<set>
#include<map>
#include<cmath>
#include<string>
#include<string.h>
#include<math.h>
#include<vector>
#include<queue>
#define maxn 100010
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
void maxmin(int a[],int low,int hight,int *maxx,int *minn)
{
    //cout<<low<<" "<<hight<<" "<<*maxx<<" "<<*minn<<endl;
    if(low==hight)
    {
        *maxx=max(*maxx,a[low]);
        *minn=min(a[low],*minn);
        return ;
    }
    int mid=(low+hight)/2;
    int maxx1=0,minn1=inf;//有这两步就不用在主函数中求最大值了
    int maxx2=0,minn2=inf;
    maxmin(a,low,mid,&maxx1,&minn1);
    maxmin(a,mid+1,hight,&maxx2,&minn2);
    *maxx=max(maxx1,maxx2);
    *minn=min(minn1,minn2);
    return ;
}
int main()
{
    int max,min,k,a[200];
    int m;
    while(scanf("%d",&k)&&k)
    {
        //max=0,min=inf;
        memset(a,0,sizeof(a));
        for(m=0;m<k;m++)
            scanf("%d",&a[m]);
        maxmin(a,0,k-1,&max,&min);
        printf("%d %d\n",max,min);
    }
}
发布了350 篇原创文章 · 获赞 715 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/ZCY19990813/article/details/100535000
今日推荐