码迷,mamicode.com
首页 > 其他好文 > 详细

[Leetcode]668.Kth Smallest Number in Multiplication Table

时间:2020-02-03 12:00:25      阅读:61      评论:0      收藏:0      [点我收藏+]

标签:通过   turn   +=   二分查找   ble   http   二分   sam   tip   

链接:LeetCode668

给定高度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).

相关标签:二分查找

乘法表的特点是每行和每列元素均按升序排序,这题就可以转换为[LeetCode]378.Kth Smallest Element in a Sorted Matrix。我们通过二分查找不断逼近真实值即可。
代码如下:

python:

class Solution:
    def findKthNumber(self, m: int, n: int, k: int) -> int:
        lo, hi = 1, m*n
        while lo <= hi:
            mid = (lo + hi) >> 1
            loc = self.countLower(m,n, mid)
            if loc < k:
                lo = mid + 1
            else:
                hi = mid - 1
        return lo

    def countLower(self, m,n, num):
        i, j = 1,n
        cnt = 0
        while i <= m and j >= 1:
            if i*j <= num:
                cnt += j
                i += 1
            else:
                j -= 1
        return cnt

C++:

class Solution {
public:
    int findKthNumber(int m, int n, int k) {
        int lo=1,hi=m*n;
        while(lo<=hi){
            mid = lo+((hi-lo)>>1);
            cnt = countSamller(m,n,mid);
            if(k <= cnt){
                hi = mid-1;
            } else {
                lo = mid+1;
            }
        }
        return lo;
    }

    int countSamller(int m,int n,int target){
        int i=1,j=n;
        int cnt = 0;
        while(i<=m && j>=1){
            if(target<(i*j)){
                j--;
            }else{
                cnt += j;
                i++;
            }
        }
        return cnt;
    }
};

[Leetcode]668.Kth Smallest Number in Multiplication Table

标签:通过   turn   +=   二分查找   ble   http   二分   sam   tip   

原文地址:https://www.cnblogs.com/hellojamest/p/12254695.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!