0
点赞
收藏
分享

微信扫一扫

【每日算法Day 83】邻居小孩一年级就会的乘法表,你会吗?


题目链接

LeetCode 668. 乘法表中第k小的数[1]


示例1


输入:
m = 3, n = 3, k = 5
输出:
3
解释:
乘法表:
1 2 3
2 4 6
3 6 9
第5小的数字是 3 (1, 2, 2, 3, 3).


示例2


输入:
m = 2, n = 3, k = 6
输出:
6
解释:
乘法表:
1 2 3
2 4 6
第6小的数字是 6 (1, 2, 2, 3, 4, 6).



题解


代码

二分法(c++)


class Solution {
public:
int findKthNumber(int m, int n, int k) {
int l = 1, r = m*n;
while (l < r) {
int mid = l+((r-l)>>1);
if (enough(mid, m, n, k)) r = mid;
else l = mid+1;
}
return l;
}

bool enough(int x, int m, int n, int k) {
int cnt = 0;
for (int i = 1; i <= m; ++i) {
cnt += x/i<n?x/i:n;
}
return cnt >= k;
}
};


二分法+优化(c++)


class Solution {
public:
int findKthNumber(int m, int n, int k) {
int l = 1, r = k;
while (l < r) {
int mid = l+((r-l)>>1);
if (enough(mid, m<mid?m:mid, n<mid?n:mid, k)) r = mid;
else l = mid+1;
}
return l;
}

bool enough(int x, int m, int n, int k) {
int cnt = n*(x/n), d = 0;
for (int i = (x/n)+1; i <= m; i = d+1) {
d = x/(x/i);
cnt += (x/i)*((d<m?d:m)-i+1);
}
return cnt >= k;
}
};


二分法(python)


class Solution:
def findKthNumber(self, m: int, n: int, k: int) -> int:
def enough(x, m, n, k):
cnt = 0
for i in range(1, m+1):
cnt += x//i if x//i<n else n
return cnt >= k

l, r = 1, m*n
while l < r:
mid = l+((r-l)>>1)
if enough(mid, m, n, k): r = mid
else: l = mid+1
return l


二分法+优化(python)


class Solution:
def findKthNumber(self, m: int, n: int, k: int) -> int:
def enough(x, m, n, k):
cnt, i, d = n*(x//n), x//n+1, 0
while i <= m:
d = x//(x//i)
cnt += (x//i)*((d if d<m else m)-i+1)
i = d+1
return cnt >= k

l, r = 1, k
while l < r:
mid = l+((r-l)>>1)
if enough(mid, m if m<mid else mid, n if n<mid else mid, k): r = mid
else: l = mid+1
return l


参考资料

[1]

LeetCode 668. 乘法表中第k小的数: ​​https://leetcode-cn.com/problems/kth-smallest-number-in-multiplication-table/​​

举报

相关推荐

0 条评论