目录
- 一些算法题
1.1 问题1:系统数数
1.2 问题2:战平即可出线
1.3 问题3:逻辑推理
1.4 问题4:天平与假币 - 链表
2.1 链表相加
2.2 链表的部分翻转 - 堆,栈
- 队列
1.一些算法题
算法包罗万象
- 推理,逻辑,“机智“
- 演绎,归纳,类比
- 严格归纳
以上任何一种能力,都要用到,而且用熟,
如果合理利用,可以非常便利得减少时间复杂度和空间复杂度。
看几个问题:
1.1 问题1:系统数数
横纵棋盘由19条线组成,问这些线能组成多少个正方形?
- 思路1:从边长的角度思考,边长为1的有18*18个,边长为2的有17*17个, ⋯ ,加起来即可
- 思路2:从点的角度思考。以每一个点为右下角各有多少个正方形,加起来就OK了。
因此,经过总结,可以建模:当长度为i时,有 (20−i)2 个正方形,为了方便扩展,写成: (19+1−i)2
对应的python程序为:
def countSqure(num):
squreSum = 0
for i in range(1,num + 1):
squreSum += (num + 1 -i)**2
return squreSum
num = countSqure(19)
print num
2470
1.2 问题2:战平即可出线
足球比赛,一个小组有八支球队进行单循环赛,胜者积3分,平则各积1分,负则不积分,规定积分最高的四只球队出线,问:至少需要多少分出线?未出线最多可能有多少分?
战况分析1:
- 出线的四支球队中,第四支球队的分数应该是最少的,它至少要多少分才能出线呢?
- 八支球队,我们分成三支强队和五支弱队,三支强队各自战胜五支弱队,而五支弱队之间全部战平,则五支弱队的积分都是4,可以通过抽签等方式决定第四支出线的队伍。
战况分析2:
- 未出线的第5支强队的分,应该是最高的。
- 假设有五支强队,他们都分别战胜了其他三支弱队,五支强队之间均按照顺序战胜了自己前后的两支强队,所以五支强队间都是胜5场,负2场。然后再通过抽签的方式来绝对第五支强队出线。这种情况下,第五支强队为出线,且分数最高,为15分。
事实上,这就是用了贪心法,或者说使用了临界点的极端情况。因为是选择4支球队,所以第五支和第三支就是我们的关注点。
思维模式:从题目中充分挖掘关键信息;选择极端条件;
1.3 问题3:逻辑推理
皇帝不是穷人,在守财奴中也有穷人,所以有一些_____不是_____