文章目录
前言
又是肝ddl的一天,所以力扣只能稍微搁置下了……
最多还有一天,到周五就恢复正常的一天三题的量吧!
1. 乘法表中第k小的数
几乎每一个人都用 乘法表。但是你能在乘法表中快速找到第k小的数字吗?
给定高度m 、宽度n 的一张 m * n的乘法表,以及正整数k,你需要返回表中第k 小的数字。
1.1 直接遍历(超时)
偷牌失败……
class Solution {
public:
int findKthNumber(int m, int n, int k) {
vector<int> ans;
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
ans.push_back(i * j);
}
}
sort(ans.begin(), ans.end());
return ans[k - 1];
}
};
1.2 优秀的解法:二分查找
考虑对于一个数,它在乘法表中的位置,也就是找有多少个数比它小,对于乘法表,每一行都是该行i的倍数,所以一个数比每行大的数要么就是列数(比所有数都大),要么就是这个数除以i然后向下取整。
class Solution {
public:
int findKthNumber(int m, int n, int k) {
int left = 1;
int right = m * n;
while (left < right) {
int mid = left + (right - left) / 2;
int count = 0;
for (int i = 1; i <= m; i++) {
count += min(mid / i, n);
}
if (count >= k) right = mid;
else left = mid + 1;
}
return left;
}
};
总结
操作系统的课设完成了大半了,明天就是进一步的完善工作……
再往后就是数据结构和算法的实验,以及实验报告……
感觉自己辛苦了!