设S是存储在数组中的一组n个整数(不一定是排序的)。设计一种算法来查找S中的10个最大整数(通过创建一个长度为10的单独数组来存储这些整数)。您的算法必须在O(n)时间内完成。
我想我可以通过使用count排序然后将最后10个元素添加到新数组中来回答这个问题。但显然这是错误的。有谁知道更好的方法吗?
答案 0 :(得分:4)
方法1:
您可以使用FindMax()算法查找O(N)
中的最大数字,如果您使用它10次:
10 * O(N) =O(N)
每次找到max num时,都会将其放入新数组中,下次使用FindMax();
方法2:
你可以使用Bubble 10次:
1) Modify Bubble Sort to run the outer loop at most 10 times.
2) Save the last 10 elements of the array obtained in step 1 to the new array.
10 * O(N) =O(N)
方法3:
您可以使用MAX Heap
:
1) Build a Max Heap in O(n)
2) Use Extract Max 10 times to get 10 maximum elements from the Max Heap 10
* O(logn)
O(N) + 10 * O(logN) = O(N)
答案 1 :(得分:1)
使用order statistic算法查找第10大元素。 接下来,迭代数组以找到所有小于/等于它的元素。
TimeComplexity:O(n)用于顺序统计+ O(n)用于迭代数组一次=>为O(n)
答案 2 :(得分:0)
答案 3 :(得分:-1)
将它们插入平衡二叉树中。 O(N)+ O(lg2 N)。