C ++中第K个最小素数

假设我们有一个排序的列表,有1和一些质数,现在对于列表中的每个p <q,我们将考虑分数p / q,然后我们必须找出哪个是第k个最小分数。我们必须返回一个数组作为答案,因此ans [0]将为p,而ans [1]将为q。

因此,如果输入像[1,3,5,7],并且k = 2,则答案将是1/5,因为分数是1 / 3、1 / 5、1 / 7、3 / 5, 3 / 7、5 / 7,第二小的是1/5。

为了解决这个问题,我们将遵循以下步骤-

  • 定义数据,这将需要a,b和a / b

  • 定义大小为2的数组ret

  • n:= A的大小

  • 定义一个优先级队列pq

  • 对于初始化i:= 0,当i <n时,更新(将i增加1),执行-

    • 将Data(A [0],A [i],0)插入pq

  • 当K不为零时,执行-

    • idx:=临时IDx + 1

    • 将Data(A [idx],temp.b,idx)插入pq

    • ret [0]:=温度的a

    • ret [1]:= b的温度

    • 返回ret

    • temp = pq的顶部元素

    • 从pq中删除元素

    • 如果K等于0,则-

    • 如果temp.idx + 1 <n,则-

    • 将K减少1

    • 返回ret

    让我们看下面的实现以更好地理解-

    示例

    #include <bits/stdc++.h>
    using namespace std;
    void print_vector(vector<auto> v){
       cout << "[";
       for(int i = 0; i<v.size(); i++){
          cout << v[i] << ", ";
       }
       cout << "]"<<endl;
    }
    struct Data{
       double val, a, b;
       int idx;
       Data(double a, double b, int c){
          val = a / b;
          this->a = a;
          this->b = b;
          idx = c;
       }
    };
    struct Comparator{
       bool operator()(Data a, Data b){
          return !(a.val < b.val);
       }
    };
    class Solution {
    public:
       vector<int> kthSmallestPrimeFraction(vector<int>& A, int K) {
          vector <int> ret(2);
          int n = A.size();
          priority_queue <Data, vector <Data>, Comparator> pq;
          for(int i = 0; i < n; i++){
             pq.push(Data(double(A[0]), double(A[i]), 0));
          }
          while(K--){
             Data temp = pq.top();
             pq.pop();
             if(K == 0){
                ret[0] = temp.a;
                ret[1] = temp.b;
                return ret;
             }
             if(temp.idx + 1 < n){
                int idx = temp.idx + 1;
                pq.push(Data(double(A[idx]), double(temp.b), idx));
             }
          }
          return ret;
       }
    };
    main(){
       Solution ob;
       vector<int> v = {1,3,5,7};
       print_vector(ob.kthSmallestPrimeFraction(v, 2));
    }

    输入值

    {1,3,5,7}
    2

    输出结果

    [1, 5, ]