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 不為零時,執行:
    • temp = pq 的頂部元素
    • 從 pq 中刪除元素
    • 如果 K 等於 0,則:
      • ret[0] := temp 的 a
      • ret[1] := temp 的 b
      • 返回 ret
    • 如果 temp.idx + 1 < n,則:
      • idx := temp 的 idx + 1
      • 將 Data(A[idx], temp.b, idx) 插入到 pq 中
    • 將 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, ]

更新於: 2020年6月2日

449 次檢視

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.