Giả sử chúng ta có một danh sách đã sắp xếp, có 1 và một số số nguyên tố, bây giờ với mọi p
Vì vậy, nếu đầu vào là [1,3,5,7] và k =2, thì câu trả lời sẽ là 1/5, vì các phân số là 1/3, 1/5, 1/7, 3/5, 3/7, 5/7, nhỏ thứ hai là 1/5.
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
- Xác định Dữ liệu, điều này sẽ lấy a, b và a / b
- Xác định ret mảng có kích thước 2
- n:=kích thước của A
- xác định một hàng đợi ưu tiên pq
- để khởi tạo i:=0, khi i
- chèn Dữ liệu (A [0], A [i], 0) vào pq
- temp =phần tử hàng đầu của pq
- xóa phần tử khỏi pq
- nếu K giống 0, thì -
- ret [0]:=tạm thời
- ret [1]:=b of temp
- trả lời lại
- nếu temp.idx + 1
- idx:=idx của temp + 1
- chèn Dữ liệu (A [idx], temp.b, idx) vào pq
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
Ví dụ
#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)); }
Đầu vào
{1,3,5,7} 2
Đầu ra
[1, 5, ]