一天一算法题,通过单调性进行算法优化

面试中算法题为什么那么重要?现在很多大公司都要求现场写代码,现场写代码总不能让你写个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去枚举,我们应该用心观察,看看是否有单调的性质!可以进行降维!

最后欢迎大家关注我的头条号,定期推送面试相关还有码农码禽码畜感兴趣的东西。当然,如果大家有什么看不懂的,例如优先队列。。。或者想沙茶敏整理哪一方面的面试题目,可以在评论中说出来。

个人资料
hadoop迷
等级:6
文章:30篇
访问:2.2w
排名: 13
推荐圈子
上一篇: YARN/MRv2的Client端代码分析
下一篇:一天一算法题,降维也许是一条途径
猜你感兴趣的圈子:
每日一算法
标签: 边界、区间、单调、枚举、联通、面试题
隐藏