美文网首页leetcode算法
668. 乘法表中第k小的数

668. 乘法表中第k小的数

作者: 刘翊扬 | 来源:发表于2022-05-18 23:22 被阅读0次

668. 乘法表中第k小的数 - 力扣(LeetCode)

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

给定高度m、宽度n 的一张m * n的乘法表,以及正整数k,你需要返回表中第k小的数字。

例1:

输入: m = 3, n = 3, k = 5
输出: 3
解释: 
乘法表:
1 2 3
2 4 6
3 6 9

第5小的数字是 3 (1, 2, 2, 3, 3).

例 2:

输入: m = 2, n = 3, k = 6
输出: 6
解释: 
乘法表:
1 2 3
2 4 6

第6小的数字是 6 (1, 2, 2, 3, 4, 6).

注意:

  • m 和n的范围在 [1, 30000] 之间。
  • k 的范围在 [1, m * n] 之间。
  • 通过次数21,392提交次数37,642

思路分析

  • 看到这个m 和 n 的范围,就应该想到使用暴力,肯定不行,会超时的
  • 怎么加快查询,要想到二分查找


    image.png

二分查找

public  int findKthNumber(int m, int n, int k) {
        // 二分查找
        int left = 0, right = m * n;
        while (left < right) {
            int mid = left + (right - left) / 2;
            if (count(m, n, mid) >= k) {
                right = mid;
            } else {
                left = mid + 1;
            }
        }
        return right;
    }

    // 统计乘法表中有多少个小于等于 k 的数目
    int count(int m, int n, int k) {
        int res = 0;
        // 统计每行小于等于 k 的数目
        for (int i = 1; i <= m; ++i) {
            res += Math.min(k / i, n);
        }
        return res;
    }

相关文章

网友评论

    本文标题:668. 乘法表中第k小的数

    本文链接:https://www.haomeiwen.com/subject/ohezurtx.html