zoukankan      html  css  js  c++  java
  • Leetcode 668.乘法表中第k小的数

    乘法表中第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).

    注意:

    1. m 和 n 的范围在 [1, 30000] 之间。
    2. k 的范围在 [1, m * n] 之间。

    思路

    二分查找,对第一个元素和最后一个元素进行二叉搜索,然后每个元素判断每一行有几个比其小的值并求和,看是否==k即可

     1 class Solution {
     2     public static int findKthNumber(int m, int n, int k) {
     3         int left = 1, right = m * n, mid;
     4         while (left <= right) {
     5             mid = left + (right - left) / 2;
     6             int count = 0, j = n;
     7             for (int i = 1; i <= m; i++) {
     8                 //遍历每一行
     9                 // 看一行中有几个元素小于当前值
    10                 while (j >= 1 && i * j > mid) j--;
    11                 //求和
    12                 count += j;
    13             }
    14             if (count < k) left = mid + 1;
    15             else right = mid - 1;
    16         }
    17         return left;
    18     }
    19 }
  • 相关阅读:
    C语言二维数组
    Foxyproxy 火狐代理插件
    Midas Civil的钢束生成器
    foobar2000 – ELPlaylist
    Foobar2000-CUI 小结
    Foobar2000–panel stack splitter
    Foobar2000 使用说明
    foobar2000-new
    书匠
    图片转文字 ocr 汉王
  • 原文地址:https://www.cnblogs.com/kexinxin/p/10394939.html
Copyright © 2011-2022 走看看