Arrays 发展算法思维

Arrays 发展算法思维,arrays,algorithm,Arrays,Algorithm,我遇到一个问题,在给定的整数数组中,我需要找到满足给定和的对 我想到的第一个解决方案是检查所有可能的对,大约是O(n^2)时间,但面试官要求我提出改进的运行时间,我建议在该时间对数组排序,然后进行二进制搜索,但这也是O(nlogn) 总的来说,我没能想出O(n)解。通过谷歌搜索,我知道这可以通过使用set的额外内存来实现 我知道在考虑算法时不可能有任何固定的规则,但我很乐观,认为在考虑数组上的算法时必须有一些启发式或心智模型。我想知道是否有任何通用策略或特定于阵列的思想可以帮助我更多地探索解决方

我遇到一个问题,在给定的整数数组中,我需要找到满足给定和的对

我想到的第一个解决方案是检查所有可能的对,大约是O(n^2)时间,但面试官要求我提出改进的运行时间,我建议在该时间对数组排序,然后进行二进制搜索,但这也是O(nlogn)

总的来说,我没能想出O(n)解。通过谷歌搜索,我知道这可以通过使用set的额外内存来实现


我知道在考虑算法时不可能有任何固定的规则,但我很乐观,认为在考虑数组上的算法时必须有一些启发式或心智模型。我想知道是否有任何通用策略或特定于阵列的思想可以帮助我更多地探索解决方案,而不是装死。

一般来说,先考虑如何天真地去做。如果在面试中,明确你在做什么,说“好吧,天真的算法是……”

然后看看是否可以看到任何重复的工作或多余的步骤。面试问题往往有点不切实际,数学特例类问题。真正的问题往往归结为使用哈希表或排序数组。排序是N log N,但它会使所有后续搜索都是O log N,因此通常值得对数据进行排序。如果数据是动态的,则通过二叉搜索树(C++“set”)对其进行排序

第二,你能“分而治之”还是“积极向上”。N=2的情况是否微不足道?在这种情况下,我们可以将N=4分为两个N=2的情况,然后再进行一个积分步骤吗?您可能需要将输入分为两组,低组和高组,在这种情况下是“分而治之”,或者您可能需要从随机对开始,然后合并为四组、八组等等,在这种情况下是“累积”


如果问题是几何的,你能利用局部一致性吗?如果问题是现实的,而不是数学的,并且有典型的输入可以利用(真正的旅行推销员不会在随机网格上的城市之间旅行,而是通过一个枢纽辐射式运输系统,快速道路连接主要城市和慢行道路,然后扩展到客户目的地)?

您只能阅读算法并尝试理解概念。换句话说:获得更多的经验,你就会进步。阅读他人的行为并从中学习。备注:特别是散列法通常是一种降低(平均)复杂性的方法,因为它允许在O(1)中进行访问。@MrSmith42,这算是一个建议:)使用相同的类似问题检查算法问题与任何其他类型的问题没有太大区别。首先,解决问题有两个部分,领域知识和问题解决策略。对于领域知识,你需要对现有的数据结构和经典算法有很好的理解,它们将是你解决任何算法问题的工具,学会灵活有效地使用它们。对于问题解决策略,请看一看经典书籍:Polya的系统方法如何解决。最后一条建议:熟能生巧。解决这个问题后,开始考虑寻找两个以上数字的组合,以得到给定的和。事情突然变得复杂多了;)