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

相关推荐
Kuo-Teng16 分钟前
LeetCode 206: Reverse Linked List
java·算法·leetcode·职场和发展
庸子1 小时前
Kubernetes调度器深度解析:从资源分配到亲和性策略的架构师之路
java·算法·云原生·贪心算法·kubernetes·devops
Sunhen_Qiletian2 小时前
YOLOv2算法详解(上篇):从经典到进化的目标检测之路
算法·yolo·目标检测
QTreeY1232 小时前
detr目标检测+deepsort/strongsort/bytetrack/botsort算法的多目标跟踪实现
人工智能·算法·yolo·目标检测·计算机视觉·目标跟踪
AiXed2 小时前
PC微信协议之nid算法
python·网络协议·算法·微信
谈笑也风生3 小时前
经典算法题之子集(四)
算法
mit6.8243 小时前
划分dp+滑窗+前缀和|deque优化
算法
Zach_yuan3 小时前
算法1111
算法
不穿格子的程序员4 小时前
从零开始刷算法——二分-搜索旋转排序数组
数据结构·算法
做怪小疯子4 小时前
LeetCode 热题 100——哈希——最长连续序列
算法·leetcode·哈希算法