剑指offer笔记(六) 第40题至第46题
前言
这次主要记录剑指offer的7道题,主要使用的语言是python,下面将对这7道题的一些感悟和知识点进行汇总!
提示:以下是本篇文章正文内容,下面案例可供参考 截图来源于LeetCode
一、JZ40 最小的k个数
常规方法很好用,也容易编写,但耗时较大。由于存在排序操作,一半时间复杂度在O(n)下搞不定,那么使用最小堆是个不错的方法。要注意啊,这里的最小堆很容易搞乱,由于需要返回k个数字,那么就用数列的前k个数字来创建动态数组,因为获取的是最小的k个数字,所以需要将最小堆转化为最大堆,很简单了,加个负号!之后就是不停地从最小堆里面“吐”数字,如果比数组下标k之后的数字大,则弹出去,将新的数字“压”进来。
以下为程序源码:
二、JZ41 数据流中的中位数
这道题挺费劲的,需要一个最小堆和一个最大堆来获得中位数,这里倾向于将奇数个数的数组的中位数存放在最小堆中。
以下为程序源码
三、JZ42 连续子数组的最大和
没什么好说的一直加 一直比较,需要注意正数的话,越加越大,负数则是越加越小,所以对待正数加操作是必须的,而负数的话仅比较便可。
以下为程序源码:
四、JZ43 1~n整数中1出现的次数
代码不多,但需要穷举法找规律,可以看蛋包饭的视频讲解,很详细。
以下为程序源码:
五、JZ44 数字序列中某一位的数字
看代码,很棒的方法,不过比较非内存,单很容易理解!传统方法需要对位数进行一个规律统计,使用start和digit两个变量进行数序的模拟,具体看代码,在此不多赘述。
以下为程序源码:
六、JZ45 把数组排成最小的数
这道题涉及一个证明问题,挺费劲的,简而言之,就是拼接的数组,左面的部分需要大于右面的部分,超级抽象,背会算了!
以下为程序源码:
七、JZ46 把数字翻译成字符串
动态规划,看代码注释理解,主要是搞懂传递公式,后面就容易理解了。
以下为程序源码:
八、总结
巨难,重新复习也发现,好难!只要涉及到找规律或者动态规划找公式就很费脑筋,直接记忆是最好的办法,别想那么多。昨天背了一句非常不错,巨美的诗:
I like for you to be still
It is as though you are absent
And you hear me from far away
And my voice does not touch you