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

相关推荐
dazzle17 分钟前
机器学习算法原理与实践-入门(三):使用数学方法实现KNN
人工智能·算法·机器学习
那个村的李富贵18 分钟前
智能炼金术:CANN加速的新材料AI设计系统
人工智能·算法·aigc·cann
张张努力变强40 分钟前
C++ STL string 类:常用接口 + auto + 范围 for全攻略,字符串操作效率拉满
开发语言·数据结构·c++·算法·stl
万岳科技系统开发41 分钟前
食堂采购系统源码库存扣减算法与并发控制实现详解
java·前端·数据库·算法
张登杰踩1 小时前
MCR ALS 多元曲线分辨算法详解
算法
YuTaoShao1 小时前
【LeetCode 每日一题】3634. 使数组平衡的最少移除数目——(解法一)排序+滑动窗口
算法·leetcode·排序算法
波波0071 小时前
每日一题:.NET 的 GC是如何分代工作的?
算法·.net·gc
HY小宝F1 小时前
职场沟通的深层智慧:从对抗到协作的自我修炼
职场和发展
风暴之零1 小时前
变点检测算法PELT
算法
深鱼~1 小时前
视觉算法性能翻倍:ops-cv经典算子的昇腾适配指南
算法·cann