• 同时找最大最小值


    题目定义:

        给定一个大小为n的数组,无序,找到其中的最大值和最小值,要求元素间的比较次数尽可能少。

    这道题出自《算法导论》。创新工场2016校招笔试也考了这道题。

    以下摘自《算法导论》:

        事实上,我们只需要最多3⌊n/2⌋次比较就可以同时找到最小值和最大值。具体的方法是记录已知的最大值和最小值,然后对输入元素成对地进行处理。首先,我们将一对输入元素相互进行比较,然后把较小的与当前最小值进行比较,把较大的与当前最大值进行比较。这样,对每两个元素共需3次比较。

        如何设定已知的最小值和最大值的初始值依赖于n是奇数还是偶数。如果n是奇数,我们就将最小值和最大值的初值都设为第一个元素的值,然后成对地处理余下的元素。如果n是偶数,就对前两个元素做一次比较,以决定最小值和最大值的初值,然后与n是奇数的情形一样,成对地处理余下的元素。

    贴一下我的代码:

    int min;
    int max;
    void findMinMax(int arr[], int n, int &min, int &max)
    {
        int begin = 0;
        if (n % 2 == 1)
        {
            min = max = arr[0];
            begin = 1;
        }
        else
        {
            if (arr[0] < arr[1])
            {
                min = arr[0];
                max = arr[1];
            } 
            else
            {
                min = arr[1];
                max = arr[0];
            }
            begin = 2;
        }
    
        for (int i = begin; i < n-1; i = i+2)
        {
            if (arr[i] < arr[i+1])
            {
                if (arr[i] < min)
                    min = arr[i];
                if (arr[i+1] > max) 
                    max = arr[i+1];
            } 
            else
            {
                if (arr[i+1] < min)
                    min = arr[i+1];
                if (arr[i] > max)
                    max = arr[i];
            }
        }
    }
  • 相关阅读:
    《C语言笔记:linux下C程序的内存映像》
    《C语言笔记:结构体内存对齐》
    《C语言笔记:一些自实现的字符串函数》
    《C语言笔记:大小端模式》
    《将博客搬至CSDN》
    《C语言笔记:三种内存来源》
    使用vue-cli3的方式创建项目并引入vant
    tomcat部署多个项目
    jenkins构建项目失败
    tomcat安装
  • 原文地址:https://www.cnblogs.com/gattaca/p/4814365.html
Copyright © 2020-2023  润新知