剑指OFFER
题目描述:输入n个整数,找出最小的k个数。
#include<iostream>
#include<string>
#include<vector>
#include<map>
#include<algorithm>
#include<climits>
#include<queue>
using namespace std;
// method 1 : priority_queue
vector<int> getLeastNums(vector<int>& nums, int k){
if(k == 0 || nums.size() <= k){
return nums;
}
vector<int> ans;
priority_queue<int> q;
for(int i = 0; i < k; i++){
q.push(nums[i]);
}
for(int i = k; i < nums.size(); i++){
if(q.top() > nums[i]){
q.pop();
q.push(nums[i]);
}
}
for(int i = 0; i < k; i++){
ans.push_back(q.top());
q.pop();
}
return ans;
}
int partion(vector<int>&nums, int left, int right){
int idx = left;
int key = nums[left];
for(int i = left + 1; i <= right; i++){
if(nums[i] < key){
idx++;
swap(nums[i], nums[idx]);
}
}
swap(nums[left], nums[idx]);
return idx;
}
void quickSort(vector<int>& nums, int left, int right, int k){
int idx = partion(nums, left, right);
if(idx == k){
return;
}else if(idx < k){
quickSort(nums, idx + 1, right, k);
}else{
quickSort(nums, left, idx - 1, k);
}
}
// method 2 : quickSort
vector<int> getLeastNumsII(vector<int>& nums, int k){
if(k == 0 || nums.size() <= k){
return nums;
}
vector<int> ans;
quickSort(nums, 0, nums.size() - 1, k);
for(int i = 0; i < k; i++){
ans.push_back(nums[i]);
}
return ans;
}
void showVector(string s, vector<int>& nums){
cout << s << endl;
for(auto i : nums){
cout << i << " ";
}
cout << endl;
}
void utils(){
vector<int> nums;
int val, k;
cout << "enter nums: ";
cin >> val;
nums.push_back(val);
while(cin.get() != '\n'){
cin >> val;
nums.push_back(val);
}
showVector("input: ", nums);
cout << "enter k: ";
cin >> k;
vector<int> ans = getLeastNums(nums, k);
showVector("output: ", ans);
ans = getLeastNumsII(nums, k);
showVector("outputII: ", ans);
}
int main(){
utils();
return 0;
}