• 同时找最大最小值


    题目定义:

        给定一个大小为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];
            }
        }
    }
  • 相关阅读:
    《最后期限》阅读笔记03
    《最后期限》阅读笔记02
    《最后期限》阅读笔记01
    返回一个二维整数数组中最大联通子数组的和
    软件工程团队开发——第一次冲刺会议总结
    结对项目开发电梯调度
    软件工程课程建议
    第二次冲刺07
    第二次冲刺06
    第二次冲刺05
  • 原文地址:https://www.cnblogs.com/gattaca/p/4814365.html
Copyright © 2020-2023  润新知