selection problem-divide and conquer

思路:

随机选取列表中的一个值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;
}

  

原文地址:https://www.cnblogs.com/pxy7896/p/6517355.html