最小的K个数
- 参与人数:3182时间限制:1秒空间限制:32768K
- 算法知识视频讲解
题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
这道题不复杂,写出快排就算成功了。关键是快排要写对啊。
快排中
while (i - j <= 0)
不能写成
while (i - j < 0)
中值的计算
int pivot = vec[(l + r) / 2];
不能写成
int pivot = vec[vec.size() / 2];
// 27.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <vector>
using namespace::std;
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> vec, int k) {
vector<int> retVec;
if (vec.empty() || k < 0 || k > vec.size()) return retVec;
QuickSort(vec, 0, vec.size() - 1);
for (int i = 0; i < k; i++) {
retVec.push_back(vec[i]);
}
return retVec;
}
void QuickSort(vector<int>& vec, int l, int r) {
int i = l;
int j = r;
int pivot = vec[(l + r) / 2];
while (i - j <= 0) {
if (vec[i] < pivot) i++;
else if (vec[j] > pivot) j--;
else {
int tmp = vec[i];
vec[i] = vec[j];
vec[j] = tmp;
i++; j--;
}
}
if (l < j)
QuickSort(vec, l, j);
if (i < r)
QuickSort(vec, i, r);
}
};
int _tmain(int argc, _TCHAR* argv[])
{
vector<int> vec;
vec.push_back(4);
vec.push_back(5);
vec.push_back(1);
vec.push_back(6);
vec.push_back(2);
vec.push_back(7);
vec.push_back(3);
vec.push_back(8);
Solution s;
s.GetLeastNumbers_Solution(vec, 4);
return 0;
}
第二次做:
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
vector<int> retVec ;
if ( input.empty() == true || k < 0 || input.size() < k ) return retVec ;
QuickSort( input, 0, input.size() - 1 ) ;
for ( int i = 0; i < k; ++ i ) {
retVec.push_back( input[i] ) ;
}
return retVec ;
}
void QuickSort( vector<int>& vec, int l, int r ) {
int i = l ;
int j = r ;
int pivot = vec[( i + j ) / 2] ;
while ( i - j <= 0 ) {
if ( vec[i] < pivot ) ++ i ;
else if ( vec[j] > pivot ) -- j ;
else {
int tmp = vec[i] ;
vec[i] = vec[j] ;
vec[j] = tmp ;
++ i ;
-- j ;
}
}
if ( l < j ) QuickSort( vec, l, j ) ;
if ( i < r ) QuickSort( vec, i, r ) ;
}
};
第三次做:
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
vector<int> retVec ;
if ( input.empty() == true || k < 0 || k > input.size() ) return retVec ;
QuickSort( input, 0, input.size() - 1 ) ;
for ( int i = 0; i < k; ++ i ) {
retVec.push_back( input[i] ) ;
}
return retVec ;
}
void QuickSort( vector<int>& vec, int left, int right ) {
if ( vec.empty() ) return ;
int i = left ;
int j = right ;
int pivot = vec[( i + j ) / 2] ;
while ( i <= j ) {
if ( vec[i] < pivot ) ++ i ;
else if ( vec[j] > pivot) -- j ;
else {
int tmp = vec[i] ;
vec[i] = vec[j] ;
vec[j] = tmp ;
++ i ;
-- j ;
}
}
if ( left < j ) QuickSort( vec, left, j ) ;
if ( i < right ) QuickSort( vec, i, right ) ;
}
};