我试图在int数组中找到最大的三个数字,但我的算法返回错误的结果
输入和输出largestthreeNumbers([141,1,17,-7,-17,-27,18,541,8,7,7])
结果[141,1,17,18,541]预期结果[141,18,541]
func largestthreeNumbers(_ array:[Int]) ->[Int]{
var first = 0
var second = 0
var thrid = 0
var result = [Int]()
if array.count < 3 {
print("Invalid Input")
return result
}
for i in 0 ..< array.count {
if array[i] > first{
thrid = second
second = first
first = array[i]
result.append(first)
}
else if(array[i] > second){
thrid = second
second = array[i]
result.append(second)
}
else if (array[i] > thrid){
thrid = array[i]
result.append(thrid)
}
}
return result
}
字符串
5条答案
按热度按时间oalqel3c1#
如果你需要保留元素的顺序,你可以通过它的值对集合元素索引进行排序,得到最高元素的最后3个索引,对它们进行排序并Map相应的元素:
字符串
如果结果的顺序不重要,你可以简单地按降序对元素进行排序,得到前n个元素:
型
如果你正在处理一个大的集合,你可以在GitHub上从Apple的swift-algorithms中检查SortedPrefix算法,就像在这篇关于如何在Swift字典中获得前3个最大值的SO文章中提到的那样。
epfja78i2#
每次你发现
first
、second
或thrid
的新的最大值时,你都在循环中附加到result
上。这可能会发生3次以上。但是所需的数组只包含3个元素。显然,你不应该在循环中添加result
。你应该只在循环结束时向
result
追加值first
、second
和thrid
。你也可以直接返回数组文字[first, second, thrid]
:字符串
kzipqqlq3#
我是这样做的,深受Sweeper方法的启发,但是构建的方式可以让你在将来添加一个优先级队列数据结构,当一个数据结构最终(希望)被添加到标准库中时。
字符串
如果你想保留初始排序,你可以这样做:
型
这确实是对大型数据集的优化,但它并不是很实用。一个简单的排序是
O(log(n) * n)
,而这只是O(n)
。你需要一个非常大的输入来使它值得复杂。3lxsmp7m4#
字符串
nlejzf6q5#
在Java中
字符串
}