题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。
直接排序:
class Solution { public: static bool cmp(int a,int b){return a>b;} vector<int> GetLeastNumbers_Solution(vector<int> input, int k) { vector<int> result; int len = input.size(); if(len==0||k>len) return result; sort(input.begin(), input.end()); for(int i=0;i<k;i++) result.push_back(input[i]); return result; } };
简单算法:简单选择排序,时间复杂度O(n^2)
class Solution { public: vector<int> GetLeastNumbers_Solution(vector<int> input, int k) { vector<int> result; if(input.size()==0||k>input.size()) return result; int minIndex; int len = input.size(); int temp; int count=0; for(int i=0;i<len,count<k;i++){ minIndex = i; count++; for(int j=i+1;j<len;j++){ if(input[minIndex] > input[j]) minIndex = j; } if(minIndex != i){ swap(input[i],input[minIndex]);//STL库函数 } result.push_back(input[i]); } return result; } };
使用堆排序:
C++实现:使用了STL库的pop_heap函数
class Solution { public: static bool cmp(int a,int b){ return a>b; } vector<int> GetLeastNumbers_Solution(vector<int> input, int k) { vector<int> result; int len = input.size(); if(len==0||k>len) return result; int arr[len]; std::copy(input.begin(), input.end(), arr); make_heap(&arr[0], &arr[len],cmp); for(int i=0;i<k;i++){ pop_heap(&arr[0], &arr[len-i],cmp); result.push_back(arr[len-1-i]); } return result; } };
C++使用优先级队列实现:
class Solution { public: static bool cmp(int a,int b){return a>b;} vector<int> GetLeastNumbers_Solution(vector<int> input, int k) { vector<int> result; int len = input.size(); if(len==0||k>len) return result; priority_queue<int,vector<int>,greater<int>> p;//注意这里是数字约小优先级越高 for(int i=0;i<len;i++){ p.push(input[i]); } for(int i=0;i<k;i++){ result.push_back(p.top()); p.pop(); } return result; } };
java优先级队列实现:
import java.util.*; public class Solution { public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) { ArrayList<Integer> in = new ArrayList<Integer>(); int len = input.length; if(len==0||k>len) return in; PriorityQueue<Integer> p = new PriorityQueue<Integer>( new Comparator<Integer>(){ public int compare(Integer o1,Integer o2){ return o1.compareTo(o2); } }); for(int i=0;i<len;i++){ p.add(input[i]); } for(int i=0;i<k;i++){ in.add(p.poll()); } return in; } }