不使用数组或循环找到五个给定数字中第三大的最快方法?

Posted

技术标签:

【中文标题】不使用数组或循环找到五个给定数字中第三大的最快方法?【英文标题】:Fastest way to find the third largest of five given numbers without using array or loops? 【发布时间】:2014-02-04 17:38:02 【问题描述】:

我正在考虑一个逻辑来找到五个给定数字中的第三大数字,而不使用数组或循环,但可以使用条件。

Here 是 stephen c 找到三元组中间值的最快方法。我想为 5 个数字找到第三大的。

我想尽可能减少比较以找到最佳解决方案。

【问题讨论】:

有意思,这里会有这样的疯子吗? :) 我猜你必须做的比较次数呈指数级增长,所以要为真正丑陋的代码做好准备。 用递归方法怎么样?它被视为循环吗? ;-) @RafaEl 让我们看看,在五个数字的情况下递归没问题。 given 5 numbers, what is the minimum number of comparisons needed to find the median? 的可能重复项 根据 Knuth 的 AOCP,最少是 6 次比较。 【参考方案1】:

这个怎么样?

public static int getMiddle(int a, int b, int c, int d, int e)

    int temp;

    if(a>b)
        temp=b; b=a; a=temp;
    
    if(b>c)
        temp=c; c=b; b=temp;
    
    if(c>d)
        temp=d; d=c; c=temp;
    
    if(d>e)
        temp=e; e=d; d=temp;
    

    if( e>d && d>c && c>b && b>a )
        return c;
    else
        return getMiddle(a, b, c, d, e);

注意:根据 5 个数字的值,我强烈认为你不能减少你必须做的总比较,但你只能简化或优化你做比较的方式。

【讨论】:

【参考方案2】:

不是最有效的,但至少它是可读的。

int median(int a, int b, int c, int d, int e) 

    if (a > b) swap(a, b);
    if (a > c) swap(a, c);
    if (a > d) swap(a, d);
    if (a > e) swap(a, e);

    if (b > c) swap(b, c);
    if (b > d) swap(b, d);
    if (b > e) swap(b, e);

    if (c > d) swap(c, d);
    if (c > e) swap(c, e);

    return c;

【讨论】:

以上是关于不使用数组或循环找到五个给定数字中第三大的最快方法?的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode练习(python):第414题:第三大的数:给定一个非空数组,返回此数组中第三大的数。如果不存在,则返回数组中最大的数。要求算法时间复杂度必须是O(n)。

寻找数组中第K大的数

在数字数组中查找缺失数字的最快方法

最快效率求出乱序数组中第k小的数

查找数组中第二大的数字

查找范围内元素数量的最快方法