26.最小的K个数

最小的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;
}


你可能感兴趣的:(26.最小的K个数)