Python Google CodeJam过去练习-减少运行时间
从2010年开始,我一直在研究一个Google Codejam算法,但时间复杂度非常糟糕 以下是来自Google Codejam的问题: TLDR-想象两座塔的侧面有一条数字线,我们从一个建筑数字线(比如从10开始)到另一个建筑数字线(比如从1开始)上的另一点画一条线。如果我们这样做n次,这些线会相交多少次 我想知道这里是否有人能提出一种方法来加速我的算法?4个小时后,我真的看不见了,我的Miinnnddd也丢了 这是我现在的代码 输入的一个例子是: 2-(案件数量) 3-(情况#1中的导线数量) 110 5.5 7 7 案例1:2-(1、10、5、5、7、7号线之间的两个交点) 2-(第2种情况下的电线数量) 5.5 2.2 案例2:0-(没有线相交) 这个算法确实适用于我给它的任何输入,但正如我所说的,它非常丑陋和缓慢Python Google CodeJam过去练习-减少运行时间,python,algorithm,Python,Algorithm,从2010年开始,我一直在研究一个Google Codejam算法,但时间复杂度非常糟糕 以下是来自Google Codejam的问题: TLDR-想象两座塔的侧面有一条数字线,我们从一个建筑数字线(比如从10开始)到另一个建筑数字线(比如从1开始)上的另一点画一条线。如果我们这样做n次,这些线会相交多少次 我想知道这里是否有人能提出一种方法来加速我的算法?4个小时后,我真的看不见了,我的Miinnnddd也丢了 这是我现在的代码 输入的一个例子是: 2-(案件数量) 3-(情况#1中的导线数量
谢谢你的帮助 因为
N
是1000,所以可以接受带有O(N^2)
的算法。所以你要做的就是按一个端点对电线进行排序
//sorted by first number
1 10
5 5
7 7
然后从一开始处理每条线,并检查它是否与前面的线相交。如果一条直线前面的第二个端点大于当前直线的第二个端点,则它们具有交点。这需要两个循环,因此O(N^2)
复杂度足以满足N=1000
您也可以将其解释为反转计数。您必须计算第二个端点的反转数,其中列表按第一个端点排序
10 5 7 -> number of inversions is 2, because of (10,5) and (10,7)
还有一个问题是计算这个问题不需要的倒数。我想你会在那里得到更好的答案,我会在那里贴两封感谢信。我想这里可能也离题了
10 5 7 -> number of inversions is 2, because of (10,5) and (10,7)