Leetcode 每日一题和每日一题的下一题刷题笔记 29/30

214 阅读2分钟

Leetcode 每日一题和每日一题的下一题刷题笔记 29/30

写在前面

这是我参与更文挑战的第29天,活动详情查看:更文挑战

快要毕业了,才发现自己被面试里的算法题吊起来锤。没办法只能以零基础的身份和同窗们共同加入了力扣刷题大军。我的同学们都非常厉害,他们平时只是谦虚,口头上说着自己不会,而我是真的不会。。。乘掘金鼓励新人每天写博客,我也凑个热闹,记录一下每天刷的前两道题,这两道题我精做。我打算每天刷五道题,其他的题目嘛,也只能强行背套路了,就不发在博客里了。

本人真的只是一个菜鸡,解题思路什么的就不要从我这里参考了,编码习惯也需要改进,各位如果想找刷题高手请教问题我觉得去找 宫水三叶的刷题日记 这位大佬比较好。我在把题目做出来之前尽量不去看题解,以免和大佬的内容撞车。

另外我也希望有得闲的大佬提供一些更高明的解题思路给我,欢迎讨论哈!

好了废话不多说开始第二十九天的前两道题吧!

2021.6.29 每日一题

168. Excel表列名称

这道题其实是进制转换,每次求余数之前要把这个数减一(从0开始),然后从0开始25结束(相当于从1开始26结束)。这么想,excel表格的序号不是程序员思维下的那种编号,要处理就全在程序员思维下处理,然后最后一步转化到非程序员思维下即可。

代码不贴了,和题解是很像的。

image.png

2021.6.29 每日一题下面的题

973. 最接近原点的 K 个点

这道题算出来距离的平方直接比就可以,开方浪费时间。用一种二分的思想,我看我现在找的这个点左边有没有第 k 小的数,如果有,继续在左边找。如果刚好分界就是第 k 小的数,停止,如果不是,继续在右边找。


class Solution {
public:
    vector<vector<int>> kClosest(vector<vector<int>>& points, int k) {
        nth_element(points.begin(), 
                    points.begin() + k - 1, 
                    points.end(), 
                    [](const vector<int>& u, const vector<int>& v) {
            return u[0] * u[0] + u[1] * u[1] < v[0] * v[0] + v[1] * v[1];
        });
        return {points.begin(), points.begin() + k};
    }
};

image.png

小结

从 0 开始求余数,从 1 开始编号。

二分的思想找第 k 小的距离

参考链接