Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在整数数组中找到第二高的数字?_Java_Algorithm_Treemap - Fatal编程技术网

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

Java 如何在整数数组中找到第二高的数字?,java,algorithm,treemap,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

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

这是一个好的实现吗

有更好的方法吗

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));
    }
}
公共类Find2ndHighest{
公共静态void main(字符串[]args){
int b[]={2,3,1,0,5};
TreeMap tree=newtreemap();

对于(int i=0;i而言,最简单的解决方案是:

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语句中,而不是
i>=highest

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

您可以遍历数组维护计数器以获得最高值和第二高值,并返回第二高值

例如:

 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]);

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


  • 您可以对数组进行排序并获取最后第二个元素-在
    O(n log n)
    中运行

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

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

    您可以对第二高的元素执行相同的操作,但是不保留最高的元素,而是保留两个最高的元素。 通过这种方式,您可以轻松实现
    O(n)
    性能

  • 最后一个解决方案的唯一问题是,它不能很好地随增量
    k
    扩展。 然而,对于任何
    k
    ()


  • 你可以简单地使用
    数组。排序
    并获取列表中的最后一个元素。你如何找到最高的数字?@madcommer-那将是最高的数字。从“大O”的角度来看,这是不必要的工作。可以“第二高”吗如果整数不是唯一的,则等于最高值?这两个问题完全不同。请查看此链接以了解更好的算法:这实际上是一个完美的解决方案,感谢hemanth帮助我以及那些建议类似解决方案的人。不适用于
    {3,1}
    ..@Dukeling感谢您指出。更新了代码注释,问题是我们想要第二高的令牌(相当于使用
    =
    而不是'>')还是第二高的类型,必须严格低于最高数字。它也不适用于负数数组。例如:{-5,-3,-8}为了使它也适用于负数,您需要像这样初始化“highest”和“secu highest”:int highest,secu highest;如果(b[0]>b[1]){highest=b[0];secu highest=b[1];}否则{highest=b[1];secu highest=b[0];}那么从数组的2个索引开始循环。对
    {3,1}无效
    …您确实需要检查最高位第二位。事实上,首先检查它,您不需要检查最高位,除非新值高于最高位第二位。(如果不是因为该错误,我会给您一个+1,因为您是第一个接近正确答案的人。)请参阅我的编辑。很抱歉这样做太草率了。您错过了正确的方法:在列表上迭代一次,并保留两个最高的数字,而不仅仅是最高的数字。(此方案扩展到10、20或更多的“最高”。)它就在那里,在3下。尽管它可以很好地扩展任何常数
    k
    ,但对于
    k
    n
    的非常数函数来说,它并不是特别有用(例如,想想中值).也许你是对的--措辞有点不清楚。但该方案的规模相当大,虽然可能没有达到中值。我想说,在“现实生活”中,它可能会超过排序,达到N/10或更好。