• 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;
    }
    

      

  • 相关阅读:
    shell查看内存
    shell 终端字符颜色
    PHP获取一年有几周以及每周开始日期和结束日期
    PHP 计算当前时间是这一年的第几周
    laravel orWhere
    进程与线程的一个简单解释
    go cap和len的区别
    go 总结常用函数
    go append 函数常见操作
    php 字符串常用函数
  • 原文地址:https://www.cnblogs.com/pxy7896/p/6517355.html
Copyright © 2020-2023  润新知