题目描述:数组里面有n个整数,请找出其中最小的k个数,要求时间复杂度尽可能低。
解法一:全部排序:
先对这个序列快速排序,再输出前k个元素。时间复杂度为O(nlogn)+O(k);
#include <iostream>
#include <algorithm>
using namespace std;
void SortFindK(int *nums, int k){
sort(nums, nums+100);
int i;
for(i = 0; i < k; ++i)
cout << nums[i] << " ";
cout << endl;
}
int main(){
int k, nums[100] = {29,-24,62,7,-30,88,75,10,24,17,-58,-40,-6,-54,69,-61,-55,
-66,-54,-13,-38,85,-14,-63,81,96,-12,-78,-48,-18,19,-48,21,42,-56,-77,
-41,-36,-15,2,-83,-48,60,-94,86,46,-2,16,-53,-8,93,9,4,-54,-2,25,36,
-21,-27,98,-92,77,83,59,-80,-48,-33,36,-73,44,-79,31,-1,56,43,81,
78,-33,40,-60,-94,49,0,-4,81,22,24,72,61,15,-63,-52,77,-94,-2,-66,96,43,0,-6};
while(cin >> k)
SortFindK(nums, k);

这篇博客探讨了在数组中寻找最小的k个数的不同方法,包括全排序、选择排序优化和线性选择算法。线性选择算法在平均情况下时间复杂度为O(n),适合用于大量数据。此外,还提及了如何将这些方法应用到三元组数量查询问题中,以降低时间复杂度。
1063

被折叠的 条评论
为什么被折叠?



