一
这里的各项操作应该不包括遍历,记忆:哈希用空间换时间(和恶魔做了交易),所以哈希全是1(一般不讨论哈希的遍历),平衡树很平衡,查找、插入、删除全是log,数组链表可以自己推。
二
这题要看到
2
∗
3
∗
5
∗
0
2*3*5*0
2∗3∗5∗0到
2
∗
3
∗
5
∗
1
2*3*5*1
2∗3∗5∗1之间总共有22个数字。且
2
∗
3
∗
5
∗
i
2*3*5*i
2∗3∗5∗i到
2
∗
3
∗
5
∗
(
i
+
1
)
2*3*5*(i+1)
2∗3∗5∗(i+1)之间都是这22个数字按顺序排列+
2
∗
3
∗
5
∗
i
2*3*5*i
2∗3∗5∗i的结果,就很容易算出1500除22商68余4,第4个数是5,对应
2
∗
3
∗
5
∗
68
+
5
=
2045
2*3*5*68+5=2045
2∗3∗5∗68+5=2045
三、连续自然数之和为1000的共有几组?(m,n都为自然数,单独1个数也算作“连续自然数”)
考虑连续个数n
当连续个数为奇数时,比较好求,中值为x,xn=1000.这个时候回头想起找1000的因子,
1000
=
2
3
∗
5
3
1000=2^3*5^3
1000=23∗53。n为奇数的话,只有可能是
5
0
、
5
1
、
5
2
、
5
3
5^0、5^1、5^2、5^3
50、51、52、53四种可能取值,其中
5
3
5^3
53算出来x过小,连续数列里面产生负数,去掉。奇数情况有3种。
当n为偶数时, 设n=2k,设中位数为
m
+
1
2
m+\frac{1}{2}
m+21,m,k为整数。则
2
k
(
m
+
1
2
)
=
1000
2k(m+\frac{1}{2})=1000
2k(m+21)=1000
k
(
2
m
+
1
)
=
1000
k(2m+1)=1000
k(2m+1)=1000
同样2m+1的可能取值为
5
0
、
5
1
、
5
2
、
5
3
5^0、5^1、5^2、5^3
50、51、52、53四种。但
5
0
、
5
1
、
5
2
5^0、5^1、5^2
50、51、52三种取值都会造成n过大,连续数列里面有负数。所以偶数情况只有一种。
综上,总共有4组。
四、
看了答案,觉得结论更重要,首先记住一个数列,叫卡特兰数。
这有什么用?第n个卡特兰数等于:
1、n个节点的二叉树有多少种(作者想到自己考研的时候还在纸上一个个画,顿时觉得心酸)
2、n个数按规定顺序入栈,有多少种出栈方式。
然后再回头看这个问题,不考虑1块,只考虑5毛(因为在这个问题里面,一块钱的多少是没有价值的,5毛才可以用来找零)当有人拿5毛来的时候,就好比那个人入栈了,当有人拿1块来买的时候,就要有之前的一个5毛出栈。这里的排队方法应该指的是将所有5毛的人看做同一类人,所有一块看做同一类人,否则具体讨论某个人就没有太大意义。
然后。。。。。套公式就好,什么!公式推导过程?我给一下链接:
卡特兰数的推导过程
五
不停的两两合并,时间复杂度是
N
2
∗
M
N^2*M
N2∗M显然不对。
看到有一个人想法很好。
确实牛逼。。。
六
快排和数距离最终位置没有关系,影响快排的永远只有每次的中间数的选取,每次都选边界数,显然就n*n了
堆排序:复杂度一直是O(nlog(n));很中庸
直接选择作为最垃圾的排序,一直是
n
2
n^2
n2。
那为什么是插入排序,这个应该反过来思考,假设一串数已经排好了,你从里面拿一个放到最后面(插入的反向操作),这个时候因为有“距离最终位置不远”的规定,你只能选取排好队列的后几位。然后不断重复。当你全部打乱之后,再插入排序的时候,每次也只是比较后几个数就插进去了。