最小的K个数
2016-07-14 15:58
288 查看
最小的K个数
时间限制:1秒空间限制:32768K
本题知识点: 数组
题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
牛客网题目链接:点击这里
方法一:
VS2010代码:#include<iostream> #include<vector> using namespace std; class Solution { public: vector<int> GetLeastNumbers_Solution(vector<int> input, int k) { vector<int> KNum; int InputNum=input.size(); if(InputNum==0 || k==0 || k>InputNum) return KNum; KNum.assign(input.begin(), input.begin()+k ); //对这K个数进行快速排序。 QuickSort(KNum, 0, k-1); //用插入算法对后面的数进行遍历 for(int i=k; i<InputNum; i++ ) { if(input[i]<KNum[k-1]) { int j=k-1; for(; input[i]<KNum[j-1] && j>0; j--) { KNum[j]=KNum[j-1]; } KNum[j]=input[i]; } } return KNum; } void QuickSort(vector<int> &Array, int begin, int end) { if(begin>=end) return; int temp=Array[begin]; int i=begin,j=end; while(i<j) { while(i<j && Array[j]>temp) j--; while(i<j && Array[i]<=temp) i++; if(i!=j) swap(Array[j],Array[i]); } if(begin!=j) swap(Array[begin],Array[j]); QuickSort(Array,begin,j-1); QuickSort(Array,j+1,end); } }; int main() { Solution s1; vector<int> test1; vector<int> result1; test1.push_back(4); test1.push_back(5); test1.push_back(1); test1.push_back(6); test1.push_back(2); test1.push_back(7); test1.push_back(3); test1.push_back(8); //test1.push_back(4); //s1.QuickSort(test1, 0, 8); for(int i=0; i<test1.size(); i++) cout<<test1[i]<<'-'; cout<<endl; result1=s1.GetLeastNumbers_Solution(test1,4); for(int i=0; i<result1.size(); i++) cout<<result1[i]<<'-'; cout<<endl; }
//桶排序,内存开销太大。基于事先知道输入数字的范围。
//快速排序和插入排序相结合。
//测试用例:[]。 输出应为空[];
//测试用例:[4,2,6,3],7。 输出应为空[]
方法二:
//方法二:有快速排序法的思想启发而来,只要最小的K个数,而不需要对这K个数排序。 class Solution { public: vector<int> GetLeastNumbers_Solution(vector<int> input, int k) { vector<int> KNum; int InputNum=input.size(); if(InputNum==0 || k==0 || k>InputNum) return KNum; //改进快速排序方法 QuickSort1(input,0,InputNum-1,k); KNum.assign(input.begin(),input.begin()+k); //对选定的数进行快速排序 QuickSort(KNum,0,k-1); return KNum; } void QuickSort1(vector<int> &Array, int begin, int end, int k) { if(begin>=end) return; int temp=Array[begin]; int i=begin,j=end; while(i<j) { while(i<j && Array[j]>temp) j--; while(i<j && Array[i]<=temp) i++; if(i!=j) swap(Array[j],Array[i]); } if(begin!=j) swap(Array[begin],Array[j]); if(j==k-1 || j==k) return; if( k<j ) QuickSort1(Array,begin,j-1,k); if( k>j) QuickSort1(Array,j+1,end,k); } void QuickSort(vector<int> &Array, int begin, int end) { if(begin>=end) return; int temp=Array[begin]; int i=begin,j=end; while(i<j) { while(i<j && Array[j]>temp) j--; while(i<j && Array[i]<=temp) i++; if(i!=j) swap(Array[j],Array[i]); } if(begin!=j) swap(Array[begin],Array[j]); QuickSort(Array,begin,j-1); QuickSort(Array,j+1,end); } };
牛客网通过代码图片:
相关文章推荐
- 快速排序
- ruby 数组使用教程
- Ruby中的数组和散列表的使用详解
- C#实现AddRange为数组添加多个元素的方法
- C#比较二个数组并找出相同或不同元素的方法
- C#动态调整数组大小的方法
- 详解Lua中的数组概念知识
- Perl中的列表和数组学习笔记
- 探索PowerShell (八) 数组、哈希表(附:复制粘贴技巧)
- C#中数组初始化与数组元素复制的方法
- C#交错数组用法实例
- Linux Shell 数组建立及使用技巧
- PowerShell数组的一些操作技巧
- C#通过yield实现数组全排列的方法
- C#不重复输出一个数组中所有元素的方法
- C#实现将数组内元素打乱顺序的方法
- C#快速排序算法实例分析
- C#递归算法之快速排序
- C#中用foreach语句遍历数组及将数组作为参数的用法
- 详解C#编程中一维数组与多维数组的使用