题目:输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4.
分析:根据分析可以发现利用快速排序,在根据排序后直接输出前面的K个数。但是该方法需要更改数组的内容,在不能更改的前提下可以利用最常规的分析max的方法。
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
在分析STL的set的时候发现一些以前不知道的问题:
在C++里面set和java里面的Treeset一样是排好序的。但是C++的迭代器的set.end()返回的是该容器的size长度的数的地址,而不是最后一个数。同时要得到最后一个数字的时候可以用reverse_iterator反向迭代器的rbegin()。
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/* 剑指offer面试题30 */ #include <iostream> #include <set> using namespace std; void MinDig(int* a,int n,int k,set<int> &b){ b.clear(); if(k < 1 || n < k){ return ; } for(int i=0;i<n;i++){ if(b.size() < k){ b.insert(a[i]); } else{ set<int>::reverse_iterator iter = b.rbegin(); if(a[i] < *(b.rbegin())){ b.erase(*(b.rbegin())); b.insert(a[i]); } } } } int main() { int n,k,m; cout << "输入:n个整数,和k个最小数的数量:" << " "; cin >> n >> k; int a[n]; if(n >= 1){ cout << "输入n个数字:" << " "; for(int i=0;i<n;i++){ cin >> m; a[i] = m; } } set<int> b; MinDig(a,n, k,b); set<int>::iterator iter = b.begin(); for(;iter!=b.end();++iter){ cout << *iter << " "; } /* cout << endl << endl; set<int> c; c.insert(2); c.insert(3); c.insert(6); c.insert(5); c.insert(8); c.insert(7); c.insert(9); c.insert(4); set<int>::iterator iterc = c.begin(); for(;iterc!=c.end();++iterc){ cout << *iterc << " "; } cout << endl << *(c.rend()) << " " << *(b.begin()) << endl; */ return 0; }