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)

注意:

m 和 n 的范围在 [1, 30000] 之间。

k 的范围在 [1, m * n] 之间。

思路

首先:涉及元素极多做不到遍历的二维矩阵里的第K小都可以用二分猜答案的套路,转化为“给定一个数,求矩阵中有多少个数比这个数小”,进而实现二分查找

本题题解:

1.与常见二分不同点在于:本题二分是把值来当作边界,而不是下标作为边界

2.获得在 m * n 乘法表中,找出每行有多少个值小于等于num, 其中每行的值为 i * j (i代表当前行,j代表当前列),通过 num // i 来获取每行小于等于 num 值的总个数

3.乘法表 m * n 最小是1,最大是m * n, 通过提前判断加速算法

4.由于目标值可能存在重复边界情况,需要注意不同条件的等号判定

题解

class Solution:
    def findKthNumber(self, m: int, n: int, k: int) -> int:
        if k == 1:
            return 1
        if k == m * n:
            return m * n
        left, right = 1, m * n
        # 二分法求值
        while left < right:
            mid = left + ((right - left) >> 2)
            if self.countsum(m, n, mid) >= k:
                right = mid
            else:
                left = mid + 1
        return left
  # 求不超过mid的值的个数
    def countsum(self, m, n, mid):
        return sum(min(mid // i, n) for i in range(1, m + 1))
目录
相关文章
|
7月前
剑指Offer LeetCode 面试题17. 打印从1到最大的n位数
剑指Offer LeetCode 面试题17. 打印从1到最大的n位数
37 0
|
Java Python
leetcode每日一题.445:两数相加II
leetcode每日一题.445:两数相加II
88 0
|
算法
题目:输出n行杨辉三角形
题目:输出n行杨辉三角形
91 0
【leetcode每日一题】1027. 最长等差数列
【leetcode每日一题】1027. 最长等差数列
|
存储 容器
代码随想录刷题|LeetCode 242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和
代码随想录刷题|LeetCode 242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和
代码随想录刷题|LeetCode 242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和
LeetCode每日一题(1)——最大回文数乘积
LeetCode每日一题(1)最大回文数乘积 1.题目 2.示例 3.思路 1.生成位数符合要求的递减的回文数 2.判断回文数是否符合要求 4.代码 5.复杂度分析
110 0
|
算法
每日算法刷题Day12-跳台阶、排列、替换空格、求n累加
⭐每日算法题解系列文章旨在精选重点与易错的算法题,总结常见的算法思路与可能出现的错误,与笔者另一系列文章有所区别,并不是以知识点的形式提升算法能力,而是以实战习题的形式理解算法,使用算法。
93 0
每日算法刷题Day12-跳台阶、排列、替换空格、求n累加
|
算法 前端开发 程序员
「LeetCode」剑指Offer-17打印从1到最大的n位数⚡️
「LeetCode」剑指Offer-17打印从1到最大的n位数⚡️
125 0
「LeetCode」剑指Offer-17打印从1到最大的n位数⚡️
|
索引
LeetCode每日一题——1175. 质数排列
请你帮忙给从 1 到 n 的数设计排列方案,使得所有的「质数」都应该被放在「质数索引」(索引从 1 开始)上;你需要返回可能的方案总数。
116 0
LeetCode每日一题——479.最大回文数乘积
给定一个整数 n ,返回 可表示为两个 n 位整数乘积的 最大回文整数 。因为答案可能非常大,所以返回它对 1337 取余 。
99 0