365天挑战LeetCode1000题——Day 010 每日一题

文章目录

  • 前言
  • 1. [乘法表中第k小的数](https://leetcode.cn/problems/kth-smallest-number-in-multiplication-table/)
    • 1.1 直接遍历(超时)
    • 1.2 优秀的解法:二分查找
  • 总结


前言

又是肝ddl的一天,所以力扣只能稍微搁置下了……
最多还有一天,到周五就恢复正常的一天三题的量吧!


1. 乘法表中第k小的数

几乎每一个人都用 乘法表。但是你能在乘法表中快速找到第k小的数字吗?

给定高度m 、宽度n 的一张 m * n的乘法表,以及正整数k,你需要返回表中第k 小的数字。

1.1 直接遍历(超时)

偷牌失败……

class Solution {
public:
    int findKthNumber(int m, int n, int k) {
        vector<int> ans;
        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= n; j++) {
                ans.push_back(i * j);
            }
        }
        sort(ans.begin(), ans.end());
        return ans[k - 1];
    }
};

1.2 优秀的解法:二分查找

考虑对于一个数,它在乘法表中的位置,也就是找有多少个数比它小,对于乘法表,每一行都是该行i的倍数,所以一个数比每行大的数要么就是列数(比所有数都大),要么就是这个数除以i然后向下取整。

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

总结

操作系统的课设完成了大半了,明天就是进一步的完善工作……
再往后就是数据结构和算法的实验,以及实验报告……
感觉自己辛苦了!

你可能感兴趣的:(LeetCode千题之路,leetcode,算法,数据结构)