selection problem-divide and conquer
2024-09-06 03:01:18
思路:
随机选取列表中的一个值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;
}
最新文章
- JavaScript高级程序设计学习笔记--DOM
- mysql - 其它
- python wmi使用
- HNU 12847 Dwarf Tower(最短路+队列优化)
- po line received is canceled(恢复PO被取消的余量)
- ABBYY导出结果为PDF注意事项
- HDU1002大数加法
- C#泛型集合—Dictionary<;K,V>;使用技巧
- 【Java基础】“数三退一”问题的代码实现
- “战术竞技类”外挂打击已开始!揭秘腾讯We Test游戏安全服务新动作!
- phpmyadmin创建mysql的存储过程
- java算法----排序----(1)插入排序
- 素数问题三步曲_HDOJ2098
- P1096(简单dp)
- vue路由跳转传参数
- Oracle&mdash;&mdash;数据库启动与关闭
- git如何查看某个人提交的日志。
- [BZOJ4016]最短路径树问题
- Java学习笔记十六:Java中的构造方法
- C++基础和STL,Effective C++笔记
热门文章
- 基于.NetCore2.1。服务类库采用.Net Standard2.0,兼容.net 4.6.1消息推送服务
- 服务器配置,负载均衡时需配置MachineKey
- 原创 html动态表格
- 在CentOS上源码安装Nginx
- GreenDao的简单使用说明(五)多表n:m
- python+selenium之验证码的处理
- HDU 4055 Number String(DP计数)
- 【TensorFlow入门完全指南】基本操作
- windows 10 无法使用内置管理员账户打开应用的解决方案
- win10 KMS激活