您的位置:首页 > 其它

LeetCode 786. K-th Smallest Prime Fraction

2018-02-27 15:17 375 查看

题意

有一个由1和质数组成的序列,对于序列中的任意p,q,若p

题解

数列长度是3000,所以最多也就10^6个分数,快排一下复杂度应该够的。但是这题应该是卡常数了。快排复杂度是N2logN2N2logN2,N是数列长度,也就是2∗N2logN2∗N2logN。

对于数列[1,2,3,5],我们考虑:

1/2
1/3 2/3
1/5 2/5 3/5


所以每次我们只把第一列的加入一个优先队列,然后每次取出最小的更新队列,这样只需要操作K次就行了。

那么复杂度就是N2logNN2logN,因为队列长度是N,所以少了常数2.

代码

struct Node {
int pos1, pos2;
int p, q;
bool operator<(const Node & b) const {
return p * b.q > q * b.p;
}
};

class Solution {
public:

vector<int> kthSmallestPrimeFraction(vector<int>& A, int K) {
priority_queue<Node> q;
for (int i = 1; i < A.size(); i++) {
Node node;
node.pos1 = 0;
node.pos2 = i;
node.p = A[node.pos1];
node.q = A[node.pos2];
q.push(node);
}
vector<int> ans = { 0, 0 };
while (K--) {
Node temp = q.top();
// cout << temp.p << temp.q << endl;
q.pop();
if (!K) {
ans[0] = temp.p;
ans[1] = temp.q;
}
if (temp.pos1 >= temp.pos2) {
continue;
}
temp.pos1++;
temp.p = A[temp.pos1];
q.push(temp);
}

return ans;
}

};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: