668. Kth Smallest Number in Multiplication Table

在这里插入图片描述

又是一题可以二分的题目没有看出来。。。我已经对自己的智商不抱希望了。。。
首先:
1.明确的上下界:最小为0,最大为m*n
2.明确的分界线:我们对于每个数,数在乘法表中小于等于它的数的个数,那么它和k的关系应该是这样:小于|等于|大于。其中等于的那一段是因为整除的缘故,所以我们要的是等于中最小的那一个。

难点是:1.想到二分(我尼玛这什么智商)2.想到数小于该数的个数,以及想到该怎么数。

class Solution {
public:
    int findKthNumber(int m, int n, int k) {
        assert(k >= 1 && k <= m*n);
        int lo = 1, hi = m * n;
        int mid;
        while (lo < hi) {
            mid = lo + (hi - lo) / 2;
            int cnt = count(m, n, mid);
            if (cnt >= k)
                hi = mid;
            else
                lo = mid + 1;
        }
        return lo;
    }
private:
    int count(int m, int n, int num) {
        int cnt = 0;
        for (int i = 1; i <= m; ++i) {
            cnt += min(n, num / i);
        }
        return cnt;
    }
};

真的蠢。。

posted @ 2019-10-07 16:53  于老师的父亲王老爷子  阅读(15)  评论(0)    收藏  举报