【LeetCode每日一题】668. 乘法表中第k小的数【困难】

几乎每一个人都用 乘法表。但是你能在乘法表中快速找到第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] 之间。

题解:
这题可以采用一个二分搜索的方法,通过搜索值,以及对于当前值,统计比它小的数的个数,然后进行二分查找,这样的时间复杂度是O(mlogmn),空间复杂度是O(1)。
class Solution {
public:
    int findKthNumber(int m, int n, int k) {
        int left = 1, right = m * n;
        while(left < right){
            int x = left + (right - left) / 2;
                       //统计比x小的数的个数
            int count = x / n * n;
            for(int i = x / n + 1; i <= m; i++){
                count += x / i;
            }
            if(count >= k){
                right = x;
            }
            else{
                left = x + 1;
            }
        }
        return left;
    }
};


全部评论

相关推荐

不愿透露姓名的神秘牛友
07-15 17:32
点赞 评论 收藏
分享
05-29 22:11
门头沟学院 Java
Elastic90:抛开学历造假不谈,这公司的招聘需求也挺怪的,Java开发还要求你有图文识别、移动端开发和c++的经验,有点逆天了。
点赞 评论 收藏
分享
05-22 09:23
门头沟学院 Java
点赞 评论 收藏
分享
07-11 13:16
湖南工学院 Java
坚定的芭乐反对画饼_...:谁也不知道,毕竟现在的互联网和十年前已经完全不同了,谁都无法预测未来
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务