每日一题-LeetCode668-乘法表中第K小的数-二分

原题链接
每日一题-LeetCode668-乘法表中第K小的数-二分_第1张图片

Note:

首先,答案的范围是 1 ~ m * n
二分去从这个范围里找答案

每次二分之后数一下有多少个比这个数小的数
遍历每一行 每行有min( mid / i, n)
统计出来之后更新二分的区间,最后确定出答案

代码如下:
class Solution {
public:
    int m, n, k;

    bool check(int mid){
        int ans = 0;
        for(int i = 1; i <= m; i ++)
            ans += min(mid / i, n);
        return ans >= k;
    }

    int findKthNumber(int _m, int _n, int _k) {
        m = _m, n = _n, k = _k;
        int l = 1, r = m * n;
        while(l < r){
            int mid = l + r >> 1;
            if(check(mid))  r = mid;
            else l = mid + 1;
        }
        return r;
    }
};

你可能感兴趣的:(leetcode,算法,二分查找)