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 }
  • 相关阅读:
    51Nod-1002-数塔取数问题
    Android Studio: Application Installation Failed解决方案
    1001 数组中和等于K的数对——51NOD
    51Nod-1005 大数加法
    aiml_入门学习
    vim使用进阶
    学习寒小阳的博客之统计机器翻译
    安装cywin
    TF-IDF学习
    Java文件读写操作
  • 原文地址:https://www.cnblogs.com/kexinxin/p/10394939.html
Copyright © 2011-2022 走看看