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

几乎每一个人都用 乘法表。但是你能在乘法表中快速找到第 k 小的数字吗?

乘法表是大小为 m x n 的一个整数矩阵,其中 mat[i][j] == i * j(下标从 1 开始)。

给你三个整数 m、n 和 k,请你在大小为 m x n 的乘法表中,找出并返回第 k 小的数字。

示例 1:

输入:m = 3, n = 3, k = 5

输出:3

解释:第 5 小的数字是 3 。

示例 2:

输入:m = 2, n = 3, k = 6

输出:6

解释:第 6 小的数字是 6 。

提示:

1 <= m, n <= 3 * 10 4 ^4 4

1 <= k <= m * n

二分答案,二分下界是1,上界是可能的最大值,即m*n:

cpp 复制代码
class Solution {
public:
    int findKthNumber(int m, int n, int k) {
        int maxLen = max(m, n);
        int minLen = min(m, n);

        int l = 1;
        int r = m * n;

        int ans = 0;

        while (l <= r) {
            int m = l + (r - l) / 2;
            
            int mulNum = 0;
            for (int i = 1; i <= min(minLen, m); ++i) {
                // 这一行(或列,是较短的那条边)中,有几个数字小于m
                mulNum += min(m / i, maxLen);

                if (mulNum > k) {
                    break;
                }
            }

            // 如果比m小的数字大于等于k,说明m找大了,缩小它
            if (mulNum >= k) {
                ans = m;
                r = m - 1;
            } else {
                l = m + 1;
            }
        }

        return ans;
    }
};

此算法时间复杂度为O(min(n,m)log(mn)),空间复杂度为O(1)。

相关推荐
小白菜又菜2 小时前
Leetcode 3432. Count Partitions with Even Sum Difference
算法·leetcode
wuhen_n3 小时前
LeetCode -- 15. 三数之和(中等)
前端·javascript·算法·leetcode
sin_hielo3 小时前
leetcode 2483
数据结构·算法·leetcode
Xの哲學4 小时前
Linux多级时间轮:高精度定时器的艺术与科学
linux·服务器·网络·算法·边缘计算
大头流矢4 小时前
归并排序与计数排序详解
数据结构·算法·排序算法
油泼辣子多加5 小时前
【信创】算法开发适配
人工智能·深度学习·算法·机器学习
Aaron15885 小时前
AD9084和Versal RF系列具体应用案例对比分析
嵌入式硬件·算法·fpga开发·硬件架构·硬件工程·信号处理·基带工程
laocooon5238578865 小时前
插入法排序 python
开发语言·python·算法
wuhen_n6 小时前
LeetCode -- 1:两数之和(简单)
javascript·算法·leetcode·职场和发展
林shir7 小时前
Java基础1.7-数组
java·算法