开发算法思维

时间:2016-10-10 09:03:27

标签: arrays algorithm

我遇到了一个问题,我需要找到一对给定的整数数组来满足给定的总和。

我遇到的第一个解决方案是检查所有可能的对,大约是O(n ^ 2)时间,但是面试官要求我提出改进的运行时间,我建议对阵列进行排序然后做二元搜索,但那也是O(nlogn)。

总的来说,我没有想出O(n)解决方案。谷歌搜索,我发现它可以通过使用set的额外内存来实现。

我知道在思考算法方面没有任何修正规则,但我很乐观并且认为在数组上思考算法时必须有一些启发式或心理模型。我想知道是否有任何通用策略或数组特定思维可以帮助我更多地探索解决方案而不是死亡。

1 个答案:

答案 0 :(得分:1)

一般来说,首先考虑如何天真地做。如果在面试中,明确你在做什么,说"那么天真的算法就是......"。

然后看看你是否可以看到任何重复的工作或冗余的步骤。面试问题往往有点不切实际,数学特殊案例类型的问题。实际问题更常见于使用散列表或排序数组。排序是N log N,但它使所有后续搜索都记录为N log N,因此通常值得对数据进行排序。如果数据是动态的,请通过二叉搜索树(C ++" set")对其进行排序。

其次,你可以分享和征服"或者"积累"。 N = 2的情况是微不足道的吗?在多数情况下,我们可以将N = 4分成两个N = 2的情况,还有另一个整合步骤?您可能需要将输入分为两组,分别为低和高,在这种情况下它是“分而治之”,或者您可能需要从随机对开始,然后合并为四肢,八等等,在这种情况下,它是"积累"。

如果问题是几何问题,你能利用当地的连贯性吗?如果问题是现实的而不是数学问题,并且你可以利用典型的投入(真正的旅行推销员不会在随机网格上的城市之间旅行,而是通过连接主要城市和缓慢道路的快速道路的枢纽和轮辐交通系统然后分支到客户目的地)?