मान लीजिए कि हमारे पास एक क्रमबद्ध सूची है, 1 और कुछ अभाज्य संख्याएँ हैं, अब सूची में प्रत्येक p
तो अगर इनपुट [1,3,5,7], और के =2 जैसा है, तो उत्तर 1/5 होगा, क्योंकि अंश 1/3, 1/5, 1/7, 3/5 हैं, 3/7, 5/7, दूसरा सबसे छोटा 1/5 है।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
- डेटा को परिभाषित करें, इसमें a, b और a/b लगेगा
- आकार 2 के सरणी रेट को परिभाषित करें
- n :=A का आकार
- एक प्राथमिकता कतार pq परिभाषित करें
- इनिशियलाइज़ i :=0 के लिए, जब i
करें - पीक्यू में डेटा (ए [0], ए [i], 0) डालें
- अस्थायी =pq का शीर्ष तत्व
- पीक्यू से तत्व हटाएं
- यदि K, 0 के समान है, तो −
- ret[0] :=a अस्थायी
- ret[1] :=b का तापमान
- रिटर्न रिटर्न
- यदि temp.idx + 1
- idx :=अस्थायी + 1 का idx
- pq में डेटा (A[idx], temp.b, idx) डालें
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
उदाहरण
#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, ]