如何在整数数组中找到第二高的数字?
这是一个很好的实施吗?
有更好的方法吗?
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));
}
}
答案 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)
有多种方法可以在未排序的数组中找到第二高的元素:
您可以对数组进行排序并获取倒数第二个元素 - 在O(n log n)
中运行。
您可以将元素存储在TreeSet而不是数组中,这就是您正在执行的操作 - 也可以在O(n log n)
中运行。
假设有一段时间你想获得最高元素 - 你所要做的就是迭代整个aray一次,同时保持变量中的最大值。
这样您就可以实现O(n)
性能。
你可以对第二个最高元素做同样的事情,但不是保持最高元素,而是保留两个最高元素。
这样您就可以轻松实现O(n)
性能。
最后一个解决方案的唯一问题是它不能很好地扩展k
。
然而,有一个线性时间算法可以找到未排序数组中k
个最高元素 - 在O(n)
中运行任何k
(http://en.wikipedia.org/wiki/Selection_algorithm)