快排解決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);
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM