输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
方法一:基于Partition函数的思路 时间复杂度是O(n) 需要修改输入数组 不适用于海量数据
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
int Partition(vector<int> &input, int start, int end)
{ int i = start; int temp = input[start], j = end; if (start < end) { while (i < j) { while (i < j && input[j] > temp) j--; if (i < j) { input[i++] = input[j]; } while (i < j && input[i] < temp) i++; if (i < j) { input[j--] = input[i]; } } input[i] = temp; } return i; } vector<int> GetLeastNumbers_Solution(vector<int> &input, int k) { vector<int> res; if (input.size() == 0 || input.size() < k || k <= 0) return res; int n = input.size(); int start = 0; int end = n - 1; int index = Partition(input, start, end); while (index != k - 1) { if (index > k - 1) { end = index - 1; index = Partition(input, start, end); } else { start = index + 1; index = Partition(input, start, end); } } for (int i = 0; i < k; i++) res.push_back(input[i]); return res; } void main() { vector< int > input = { 4 , 5 , 1 , 6 , 2 , 7 , 3 , 8 }; vector< int > GetLeastNumbers_Solution_ = GetLeastNumbers_Solution(input, 4 ); return ; } |
方法二:基于堆或红黑树的思路 时间复杂度是O(n*logK) 不需要修改输入数组 适用于海量数据
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
typedef
multiset<
int
, greater<
int
> > intSet;
typedef multiset< int , greater< int > >::iterator setIterator; vector< int > GetLeastNumbers_Solution(vector< int > &input, int k) { intSet lest; vector< int > res; if (input.size() == 0 || input.size() < k || k <= 0 ) return res; lest.clear(); vector< int >::const_iterator iter = input.begin(); for (; iter != input.end(); ++iter) { if (lest.size() < k) { lest.insert(*iter); } else { setIterator iterGreatest = lest.begin(); if (*iter < * (lest.begin())) { lest.erase(iterGreatest); lest.insert(*iter); } } } for ( auto it = lest.begin(); it != lest.end(); it++) { res.push_back(*it); } return res; }
void main()
{ vector<int> input = { 4,5,1,6,2,7,3,8 }; vector<int> GetLeastNumbers_Solution_ = GetLeastNumbers_Solution(input, 1); return;
}
|