zoukankan      html  css  js  c++  java
  • 快排解决TopK问题 C++实现

    面试中遇到的问题,挺有意思的记录一下。

    C++版本

    // 快排变形.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
    //
    
    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    int partion(vector<int>& nums,int left, int right)
    {
        int key = nums[left];
        while (left < right)
        {
            while (left < right && nums[right] >= key) right--;
            nums[left] = nums[right];
            while (left < right && nums[left] <= key) left++;
            nums[right] = nums[left];
        }
        nums[left] = key;
        return left;
    }
    
    int topK(vector<int>& nums, int low, int high, int k)
    {
        if (low == high) return nums[low];
        int pos = partion(nums, low, high);
    
        int len = high - pos + 1;
        if (len == k) return nums[pos];
        else if (len > k) return topK(nums, pos+1, high, k);
        else return topK(nums, low, pos -1, k-len);
    }
    
    
    int main()
    {
        vector<int> nums = { 12,52,1,59,46,49,65,58,15,34,28,9,5 };
        int n = nums.size();
        cout << topK(nums, 0, n - 1, 3);
    }
  • 相关阅读:
    [APIO2007]风铃
    [APIO2011]方格染色
    [APIO2016]烟火表演
    [APIO2013]机器人
    [APIO2015]巴厘岛的雕塑
    [APIO2015]八邻旁之桥
    [APIO2010]特别行动队
    [APIO2015]雅加达的摩天楼
    WC2019游记
    退役前的做题记录3.0
  • 原文地址:https://www.cnblogs.com/BillowJ/p/14591106.html
Copyright © 2011-2022 走看看