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)。

相关推荐
Ayanami_Reii8 分钟前
进阶数据结构应用-SPOJ 3267 D-query
数据结构·算法·线段树·主席树·持久化线段树
天才测试猿34 分钟前
Jmeter压测实战:Jmeter二次开发之自定义函数
自动化测试·软件测试·python·测试工具·jmeter·职场和发展·压力测试
guygg881 小时前
基于全变差的压缩感知视频图像重构算法
算法·重构·音视频
尋有緣1 小时前
力扣1327-列出指定时间段内所有的下单产品
leetcode·oracle·数据库开发
VT LI1 小时前
SDF在实时图形渲染中的核心原理与架构创新
算法·sdf·有号距离场
想七想八不如114081 小时前
408操作系统 PV专题
开发语言·算法
天一生水water1 小时前
储层认知→技术落地→产量优化
人工智能·算法·机器学习
明洞日记1 小时前
【VTK手册019】 深入理解 vtkProperty:从几何表达到 PBR 物理渲染
c++·图像处理·算法·vtk·图形渲染
Genevieve_xiao1 小时前
【数据结构与算法】【xjtuse】面向考纲学习(下)
java·数据结构·学习·算法
修炼地1 小时前
代码随想录算法训练营第二十七天 | 56. 合并区间、738.单调递增的数字、968.监控二叉树
c++·算法