思路:

随机选取列表中的一个值v,然后将列表分为小于v的,等于v的,大于v的三组。对于k<=left.size()时,

在left中执行selection;落在中间的,返回v;k>left.size()+mid.size()时,在right中执行selection。

需要注意rand()函数的使用。

#include <iostream>
#include <cmath>
#include <vector>
#include <ctime>
#include <time.h>
#include <stdlib.h>
using namespace std; class Solution {
public:
int selection(vector<int>& s, int k) {
// for rand()
srand((unsigned)time(0));
// [0,size-1]
int v = s[rand() % (s.size())];
vector<int> left, mid, right;
// assign values to left, mid and right
for (int i = 0; i < s.size(); i++) {
if (s[i] < v)
left.push_back(s[i]);
else if (s[i] == v)
mid.push_back(s[i]);
else
right.push_back(s[i]);
}
// k < v
if (k <= left.size())
return selection(left, k);
else if (k > left.size() && k <= left.size()+mid.size())
return v;
else
// k > v
return selection(right, k-left.size()-mid.size());
}
}; int main() {
Solution s;
int arr[11] = {2,36,5,21,8,13,11,20,5,4,1};
vector<int> v(arr, arr+11);
cout << s.selection(v,6) << endl;
return 0;
}

  

最新文章

  1. JavaScript高级程序设计学习笔记--DOM
  2. mysql - 其它
  3. python wmi使用
  4. HNU 12847 Dwarf Tower(最短路+队列优化)
  5. po line received is canceled(恢复PO被取消的余量)
  6. ABBYY导出结果为PDF注意事项
  7. HDU1002大数加法
  8. C#泛型集合—Dictionary&lt;K,V&gt;使用技巧
  9. 【Java基础】“数三退一”问题的代码实现
  10. “战术竞技类”外挂打击已开始!揭秘腾讯We Test游戏安全服务新动作!
  11. phpmyadmin创建mysql的存储过程
  12. java算法----排序----(1)插入排序
  13. 素数问题三步曲_HDOJ2098
  14. P1096(简单dp)
  15. vue路由跳转传参数
  16. Oracle&mdash;&mdash;数据库启动与关闭
  17. git如何查看某个人提交的日志。
  18. [BZOJ4016]最短路径树问题
  19. Java学习笔记十六:Java中的构造方法
  20. C++基础和STL,Effective C++笔记

热门文章

  1. 基于.NetCore2.1。服务类库采用.Net Standard2.0,兼容.net 4.6.1消息推送服务
  2. 服务器配置,负载均衡时需配置MachineKey
  3. 原创 html动态表格
  4. 在CentOS上源码安装Nginx
  5. GreenDao的简单使用说明(五)多表n:m
  6. python+selenium之验证码的处理
  7. HDU 4055 Number String(DP计数)
  8. 【TensorFlow入门完全指南】基本操作
  9. windows 10 无法使用内置管理员账户打开应用的解决方案
  10. win10 KMS激活