我正在尝试解决一个问题,在该问题中,我需要编写 java 代码以在给定以下条件的情况下找到数组中的两个最大和最小数字:
- 每个元素都是一个实数
- 每个元素都是随机的
关于最佳方法的任何想法?
我正在尝试解决一个问题,在该问题中,我需要编写 java 代码以在给定以下条件的情况下找到数组中的两个最大和最小数字:
- 每个元素都是一个实数
- 每个元素都是随机的
关于最佳方法的任何想法?
您必须检查每个数字,因此您的最佳算法在数组长度上是线性的。
标准方法是只扫描数组,跟踪您目前看到的两个最小和最大的数字。
因此,鉴于 , 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)
空间中,并且是最佳的,因为它只为顶部和底部两个值使用四个额外的内存位置。
有一个变量来跟踪您目前看到的 min、second_min、max 和 second_max 值。
您可以一一浏览数组的元素,并相应地更新您的最小/最大变量。以下是一些需要考虑的情况:
是否需要超优化性能?如果不,
Arrays.sort( array );
查看第一个和最后两个元素。
我认为最好的方法是尽可能将数组用作堆或特殊数据结构。保持结构平衡和分类对您来说是最有效的。这意味着在数组中的某些索引处保留一些元素为空,因为数组的索引将是有关 ADT 的信息。http://en.wikipedia.org/wiki/Heap_(data_structure)