leetcode 668. Kth Smallest Number in Multiplication Table 有序矩阵搜索 + 右上角二分搜索
  DDSsGJLL0ZIX 2023年11月02日 40 0


Nearly every one have used the Multiplication Table. But could you find out the k-th smallest number quickly from the multiplication table?

Given the height m and the length n of a m * n Multiplication Table, and a positive integer k, you need to return the k-th smallest number in this table.

Example 1:
Input: m = 3, n = 3, k = 5
Output:
Explanation:
The Multiplication Table:
1 2 3
2 4 6
3 6 9

The 5-th smallest number is 3 (1, 2, 2, 3, 3).
Example 2:
Input: m = 2, n = 3, k = 6
Output:
Explanation:
The Multiplication Table:
1 2 3
2 4 6

The 6-th smallest number is 6 (1, 2, 2, 3, 4, 6).
Note:
The m and n will be in the range [1, 30000].
The k will be in the range [1, m * n]

本题题意就是在一个m*n的乘法表,然后要求找到第k小的数字

建议和leetcode 240. Search a 2D Matrix II 矩阵搜索 + 右上角搜索 和 leetcode 378. Kth Smallest Element in a Sorted Matrix一起学习

代码如下:

#include <iostream>
#include <vector>
#include <map>
#include <unordered_map>
#include <set>
#include <unordered_set>
#include <queue>
#include <stack>
#include <string>
#include <climits>
#include <algorithm>
#include <sstream>
#include <functional>
#include <bitset>
#include <numeric>
#include <cmath>
#include <regex>
#include <iomanip>
#include <cstdlib>
#include <ctime>

using namespace std;

#include <iostream>
#include <vector>
#include <map>
#include <unordered_map>
#include <set>
#include <unordered_set>
#include <queue>
#include <stack>
#include <string>
#include <climits>
#include <algorithm>
#include <sstream>
#include <functional>
#include <bitset>
#include <numeric>
#include <cmath>
#include <regex>
#include <iomanip>
#include <cstdlib>
#include <ctime>

using namespace std;

class Solution 
{
public:
    int findKthNumber(int m, int n, int k)
    {
        int left = 1, right = m*n;
        while (left < right)
        {
            int mid = (right - left) / 2 + left;
            int count = calaCount(m, n, mid);
            if (count < k)
                left = mid + 1;
            else
                right = mid;
        }
        return left;
    }

    int calaCount(int row, int col, int target)
    {
        int res = 0;
        int i = 1, j = col;
        while (i <= row && j >= 1)
        {
            if (i*j <= target)
            {
                res += j;
                i++;
            }
            else
                j--;
        }
        return res;
    }
};


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  wD98WYW8hiWJ   2023年11月20日   33   0   0 #include
  v0MZS93bOvwU   2023年11月02日   57   0   0 #include
  oYd6WBUwpOnX   2023年11月02日   46   0   0 3D2d缩放ios
DDSsGJLL0ZIX