如何在整数数组中找到第二高的数字?

时间:2014-01-29 00:03:06

标签: java algorithm treemap

如何在整数数组中找到第二高的数字?

这是一个很好的实施吗?

有更好的方法吗?

public class Find2ndHighest {
    public static void main(String[] args) {
        int b[] = {2,3,1,0,5};

        TreeMap<Integer,Integer> tree = new TreeMap<Integer,Integer>();
        for(int i = 0; i<b.length;i++){
            tree.put(b[i], 0);
        }
        System.out.println(tree.floorKey(tree.lastKey()-1));
    }
}

3 个答案:

答案 0 :(得分:7)

您可以对数组进行排序并获取在O(nlogn)中执行的倒数第二个元素,但只有在您确定数组中没有重复项时才有效,否则此方法不可靠。

您可以遍历数组维护计数器以获得最高和第二高,并返回第二高。这在O(n)

中执行

示例:

 int highest = Integer.MIN_VALUE+1; 
 int sec_highest = Integer.MIN_VALUE;
 for(int i : b) //b is array of integers
 {
     if(i>highest)
     {
        sec_highest = highest; //make current highest to second highest
        highest = i; //make current value to highest
     }
     else if(i>sec_highest && i != highest) 
     {
        sec_highest = i;
     }
 }

另一种解决方案是:

int b[] = {1, 2, 31,22,12,12};
Arrays.sort(b);
System.out.println(b[b.length-2]);

答案 1 :(得分:2)

最简单的解决方案是:

public static void main(String[] args) {
    int b[] = {2,3,1,0,5};
    int highest = Integer.MIN_VALUE;
    int highest2nd = Integer.MIN_VALUE;
    for(int i :b ) 
        if (i>=highest) { 
            highest2nd = highest;
            highest = i;
        } else if (i>= highest2nd)
            highest2nd = i;
    System.out.println(highest2nd);
}

然后,您只需浏览一次列表,这是从“大O”角度来看最好的。

PS:根据您是想要第二高的唯一值,还是要求严格低于最高值的值,您可以选择将i>highest放在if语句中,而不是{{1} }。

答案 2 :(得分:1)

有多种方法可以在未排序的数组中找到第二高的元素:

  1. 您可以对数组进行排序并获取倒数第二个元素 - 在O(n log n)中运行。

  2. 您可以将元素存储在TreeSet而不是数组中,这就是您正在执行的操作 - 也可以在O(n log n)中运行。

  3. 假设有一段时间你想获得最高元素 - 你所要做的就是迭代整个aray一次,同时保持变量中的最大值。 这样您就可以实现O(n)性能。

    你可以对第二个最高元素做同样的事情,但不是保持最高元素,而是保留两个最高元素。 这样您就可以轻松实现O(n)性能。

  4. 最后一个解决方案的唯一问题是它不能很好地扩展k。 然而,有一个线性时间算法可以找到未排序数组中k个最高元素 - 在O(n)中运行任何khttp://en.wikipedia.org/wiki/Selection_algorithm

    < / LI>