标签:return Matrix int len Element 378 vector tot size
二分查找
区间长度为[mn, mx]
然后O(n) 求出 <= 每个mid的个数
和k比较
class Solution {
public:
int kthSmallest(vector<vector<int>>& v, int k) {
int len = v.size();
if(k <= 0 || len*len < k || len == 0)
return -1;
int mx = INT_MIN, mn = INT_MAX;
for(auto vv : v) {
for(auto vvv : vv) {
mx = max(mx, vvv);
mn = min(mn, vvv);
}
}
int ans = -1;
int l = mn, r = mx;
while(l <= r) {
int m = l + (r-l)/2;
if(count(v, m) >= k)
ans = m, r = m-1;
else
l = m+1;
}
return ans;
}
int count(vector<vector<int>>& v, int m) {
int len = v.size();
int i = len-1, j = 0;
int tot = 0;
while(i >=0 && j < len) {
if(v[i][j] > m)
i--;
else {
tot += i + 1;
j++;
}
}
return tot;
}
};
堆
建立一个堆,然后不断的pop k次.. 最后一次pop的就是了
注意cmp的写法
class Solution {
public:
struct cmp{
bool operator() (const pair<int,pair<int,int>> &a,
const pair<int,pair<int,int>> &b) {
return a.first > b.first;
}
};
int kthSmallest(vector<vector<int>>& v, int k) {
int len = v.size();
if(len == 0 || k <= 0 || len*len <k)
return -1;
priority_queue<pair<int,pair<int,int>>,vector<pair<int,pair<int,int>>>,
cmp> que;
for(int i=0; i<len; i++) {
que.push({v[i][0], {i,0}});
}
int x = k, ans = -1;
while(x --) {
ans = que.top().first;
int i = que.top().second.first;
int j = que.top().second.second;
que.pop();
if(j != len-1)
que.push({v[i][j+1], {i,j+1}});
}
return ans;
}
};
标签:return,Matrix,int,len,Element,378,vector,tot,size 来源: https://www.cnblogs.com/Draymonder/p/10990526.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。