zoukankan      html  css  js  c++  java
  • 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;
    }
    

      

  • 相关阅读:
    A
    E
    C
    A
    exgcd
    博客
    简单数论
    extended_gcd(扩展欧几里德算法) 青蛙的约会
    扩展欧几里德算法—求解不定方程,线性同余方程
    素数筛 E
  • 原文地址:https://www.cnblogs.com/pxy7896/p/6517355.html
Copyright © 2011-2022 走看看