1.解题没有思路时候,可以先排个序看看。
2.建议平时在自己的路径下记录常用的数据结构,时常复习,在考试时候可以直接套用。
3.一个时间复杂度为T(n)的算法是否超时,考试要求程序执行时间小于1s,考试机器大约执行10^9次/s运算。
如果程序的计算次数超过10^9,可能超时;
如果程序的计算次数超过10^10,基本肯定超时;
例:
若n=10^6,则n^2超过限制,只能采用O(nlogn)时间复杂度的算法。
若n=10^4,则n^2没超过限制,可以采用O(n^2)时间复杂度的算法。
考试的数据规模决定了能通过的算法复杂度:
10^6~10^7,说明要设计一个O(n)的算法。
5*10^4~10^5,说明要设计一个O(nlogn)的算法,要把数据规模不断折半处理的方式解决。
10^3,说明可以用O(n^2)时间复杂度的算法解决。
10^2,说明可以用O(n^3)时间复杂度的算法解决。
4.动态规划有个关键点:选或者不选。
5.一般谈到最短路径的问题,可以考虑BFS。
广度优先搜索需要借助队列来实现,遍历得到的路径就是,起始顶点到终止顶点的最短路径。深度优先搜索用的是回溯思想,是借助栈来实现的,非常适合用递归实现。
6.递归、回溯、DFS三个词不太一样,回溯可以理解为就是DFS。
递归:代码结构,自己调用自己;(递归函数下,就是回溯的逻辑)
回溯:算法思想,穷举搜索尝试;(回溯其实是一个暴力搜索算法,并非是高效的算法)
DFS:深度优先遍历,Depth-First-Search。
7.学习数据结构最难的不是理解和掌握原理,而是能灵活地将各种场景和问题抽象成对应的数据结构和算法。
例如,迷宫可以抽象成图(如何在计算机中存储一个迷宫?),走迷宫可以抽象成搜索算法。
8.学习别人优秀的代码是提升自己代码水平的最快方式。
9.LeetCode的前400题非常经典,可以考虑反复刷。
10.不要copy代码,尽量都手工敲代码,形成肌肉记忆。
11.注意判断整数乘积结果是否超int范围。
12.读题解,要融会贯通,学好别人的思路后,自己实现。
13.万变不离其宗,想方设法将复杂的问题简单化,用简单的方法去解决。
14.负数如何正确取余数呢? 正负数情况都包含了,结果key即为余数。int key = (temp / k + k) % k;
yo peace!
网友评论