我正在尝试解决一个问题,我需要编写java代码,在给定以下条件的情况下找到数组中最高和最小的两个数字:
- 每个元素都是一个实数
- 每个元素都是随机的
关于最佳方法的任何想法?
答案 0 :(得分:6)
您必须检查每个数字,因此您的最佳算法在数组长度上是线性的。
标准方法是只扫描阵列,跟踪到目前为止您看到的两个最小和最大的数字。
因此,鉴于firstMin
,secondMin
,firstMax
,secondMax
分别是您目前看到的最小,第二小,最大和第二大值,在循环的下一次迭代中:
if (value > firstMax) {
secondMax = firstMax;
firstMax = value;
}
else if (value > secondMax) {
secondMax = value;
}
if (value < firstMin) {
secondMin = firstMin;
firstMin = value;
}
else if (value < secondMin) {
secondMin = value;
}
在此块结束时,我们维护firstMin
,secondMin
,firstMax
,secondMax
分别是最小,第二小,最大和第二大的不变量你到目前为止看到的价值观。这证明了正确性。
此算法在数组长度上是线性的,并且只检查每个值一次,并进行最小比较次数。它在空间中也是O(1)
,并且是最佳的,因为它仅对顶部和底部两个值使用四个额外的内存位置。
答案 1 :(得分:5)
有一个变量来跟踪到目前为止你看到的min,second_min,max和second_max值。
您可以逐个浏览数组的元素,并相应地更新您的最小/最大变量。以下是一些需要考虑的案例:
答案 2 :(得分:2)
是否需要超级优化的性能?如果没有,
Arrays.sort( array );
查看第一个和最后两个元素。
答案 3 :(得分:0)
我认为最好的方法是将数组用作堆或特殊数据结构(如果可以)。保持结构平衡和分类对您来说最有效。这意味着在数组的某些indix中保留一些元素为空,因为数组的索引将是有关ADT的信息。 http://en.wikipedia.org/wiki/Heap_(data_structure)