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

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

乘法表是大小为 m x n 的一个整数矩阵,其中 matij == 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)。

相关推荐
地平线开发者8 小时前
J6B vio scenario sample
算法
BothSavage20 小时前
Trae远程开发中DeepSeek自定义模型4054错误的排查与修复
算法
小林ixn20 小时前
从暴力到KMP:一道题彻底搞懂字符串匹配的前世今生
算法
烬羽1 天前
字符串算法入门:从反转字符串到回文判断,面试不再慌
算法·面试
先吃饱再说2 天前
判断回文字符串,从一行代码到双指针优化
算法
黄敬峰2 天前
深入理解算法核心:从递归思想、数组扁平化到快速排序
算法
得物技术2 天前
从狂野代码到按目标生产:得物推荐 AI Harness 的工程化实践|AICon 演讲整理
人工智能·算法·架构
AI小老六2 天前
SkillOpt 架构拆解:把 Skill 文本当参数,用执行轨迹训练 Agent
后端·算法·ai编程