สมมติว่าเรามีรายการที่เรียงลำดับแล้ว มี 1 และจำนวนเฉพาะบางจำนวน ตอนนี้สำหรับทุก p
ดังนั้นหากอินพุตเป็น [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
- กำหนดอาร์เรย์ ret ขนาด 2
- n :=ขนาดของ A
- กำหนดลำดับความสำคัญ pq หนึ่งคิว
- สำหรับการเริ่มต้น i :=0 เมื่อฉัน
- แทรก Data(A[0], A[i], 0) ลงใน pq
- temp =องค์ประกอบด้านบนของ pq
- ลบองค์ประกอบออกจาก pq
- ถ้า K เท่ากับ 0 แล้ว −
- ret[0] :=a ของอุณหภูมิ
- ret[1] :=b ของอุณหภูมิ
- คืนสินค้า
- ถ้า temp.idx + 1
- idx :=idx ของอุณหภูมิ + 1
- แทรกข้อมูล (A[idx], temp.b, idx) ลงใน pq
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#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, ]