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或更好。