剑指offer day5
41、数据流中的中位数https://leetcode-cn.com/problems/shu-ju-liu-zhong-de-zhong-wei-shu-lcof/
本题的大致思路是:我们维护两个堆,其中左边为最大堆,右边为最小堆,并且最大堆中元素的数量和最小堆只相差1.
这样可以保证,他们中间的那个数正好是中位数。如果两个堆中数量大小相同,则为堆顶元素的平均数.
1 | class MedianFinder { |
42、连续子数组的最大和 https://leetcode-cn.com/problems/lian-xu-zi-shu-zu-de-zui-da-he-lcof/
题目意思很明确,让我们求出连续子数组的最大和,我们可以尝试利用暴力解法。
直接枚举两个数所在的位置 其中时间复杂度为O(n^2)
- 暴力枚举
1 | class Solution{ |
但是在本题最后一个案例通不过。既然O(n^2)不行,我们可以像进一步优化
dp
实际上看到“最”这个字,就可以知道这是一个很明显的dp问题。
我们定义dp[i]为前i个数的连续子数组的最大和
1 | class Solution { |
事实上,本题我们不必要开一个数组,即我们可以做到空间复杂度为O(1)
1 | class Solution { |
43、 1~n整数中1出现的次数 https://leetcode-cn.com/problems/1nzheng-shu-zhong-1chu-xian-de-ci-shu-lcof/
如果最高位为1,举个例子 1234 其中1-999中1出现的个数为f(cur-1) 然后1000到1234中 千分位中1所出现的次数为234+1 即 1+last,剩下的为234中1出现的次数,即 f(last)即 总共为 f(cur-1)+1+last+f(last)
如果最高位不是1,举个例子 2345 其中1-999中1出现的次数为f(cur-1),然后1000-1999中千分位中1出现的次数为1000,即cur,然后 后面剩下的1出现的次数为f(cur-1) 最后算2000-2345中出现的次数为f(last),
即f(cur-1)*high+cur+f(last)
1 | class Solution{ |
44、数字序列中某一位的数字 https://leetcode-cn.com/problems/shu-zi-xu-lie-zhong-mou-yi-wei-de-shu-zi-lcof/
这题跟上面那一题一样,都是属于找规律的题。
1 | class Solution { |
45、把数组排成最小的数
这道题有一个比较直接的做法,就是我们求出所有数的全排列,然后拼接起来,这听起来比较像之前求字符串的排列那一道题。 我们利用同样的方法可以求出数字的全排列,然后将其拼接再比较。
或者,我们可以自定义一个排序规则。 即,给定两个数m,n我们需要找到一个排序规则,确定m和n谁应该排在前面,而不是仅仅只比较数值。 最直接的方式就是我们将数字转换为字符串
1 | class Solution { |
46、把数字翻译成字符串 https://leetcode-cn.com/problems/ba-shu-zi-fan-yi-cheng-zi-fu-chuan-lcof/
事实上是一个加强版的爬楼梯,不过有一个额外的限制条件。即当数字首位为1或者首位为2并且后一位小于6 时,相当于有多种选择。
1 | class Solution{ |
47、礼物的最大价值 https://leetcode-cn.com/problems/li-wu-de-zui-da-jie-zhi-lcof/
标准的dp,就不解释了
1 | class Solution{ |
48、最长不含重复字符的子字符串 https://leetcode-cn.com/problems/zui-chang-bu-han-zhong-fu-zi-fu-de-zi-zi-fu-chuan-lcof/
维护一个窗口,然后一直扫过
1 | class Solution{ |
49、丑数 https://leetcode-cn.com/problems/chou-shu-lcof/
既然想求按顺序从小到大的丑数,我们可以利用最小堆,这样堆顶元素就是最小值
1 | class Solution { |
上述方法执行效率不高,现在我们需要一种更加高效的解法,三指针
1 | class Solution{ |
50、第一个只出现一次的字符 https://leetcode-cn.com/problems/di-yi-ge-zhi-chu-xian-yi-ci-de-zi-fu-lcof/
哈希表存储加扫描
1 | class Solution { |