面试中算法题为什么那么重要?现在很多大公司都要求现场写代码,现场写代码总不能让你写个cache怎么调优,应用如何更加高效的部署吧。所以很多公司面试都会选择一些较为简单的算法题,一方面是考察你的算法基础,更重要地是看你分析问题的能力。
单调性质,往往能够对方法进行优化。我们来看一道面试题,来看看常见的单调特性。(这个题目可能有点难,不过我们仍然可以来感受下这个思想)。
原题:
现在有一个图,图上面有一些点,第i点跟第j点的距离为dist[i][j]。现在我们可以去掉一些边,让这个图仍然是强联通图。并且图中最大的边与最小的边差距最小。
这个图的点的个数2 <= n <= 50
提示:强联通图中的任意两点都可以互相到达。
干货:
解决这种求某个区间最大或者最小的问题,我们通常可以采用枚举区间的方法,即枚举区间的左边界与右边界来解决问题。
当我们确定区间之后,我们就能去掉图中不在这个区间的边,然后判断是否为强联通。
干货2:
求区间的题目,区间的左右边界一般是题目给定的某些数据。
例如在这个题目中,区间的左右边界一定是某条边!(这个显而易见,如果有一条边为11,右边界11跟11.5都可以用到这条边,很明显11更优。)
思考:
这个题目首先要考虑的是如何判断一个图是强联通图,这里我们先讲一种暴力的解决方法。
枚举每一个点,判断这个点能否到达图中的其它点。 时间复杂度(N * N)
我们枚举左右边界,总共有50*50=2500条边,那么复杂度为50*50 * 50 *50,加上上面的判断,总复杂度为50^6 = 1.5 * 10^10。
我们来探讨有没有更优的解决方法,我们将边的大小从小到大排序后,我们发现了这么一个特殊的性质。
假如当左边界确定为L1的时候,右边界为R1可以找到一个合法的解,那么,无需再找下一个右边界!(想一想为什么)
那么,当左边界变为L2时,右边界R2的位置一定>=R1.(假设R'小于R1,因为[L1,R']无解,所以[L2,R']无解)也就是存在单调性!
在这个的基础上,我们不再需要去用两个for枚举左右边界了。可以把复杂度降到 O(50^4)。
总结
在一些区间问题上,需要用多个for去枚举,我们应该用心观察,看看是否有单调的性质!可以进行降维!
最后欢迎大家关注我的头条号,定期推送面试相关还有码农码禽码畜感兴趣的东西。当然,如果大家有什么看不懂的,例如优先队列。。。或者想沙茶敏整理哪一方面的面试题目,可以在评论中说出来。