【发布时间】:2018-09-10 15:10:06
【问题描述】:
我今天早些时候进行了这个测试,我试图太聪明并遇到了障碍。不幸的是,我陷入了这种思维定势,浪费了太多时间,未能通过这部分测试。后来我解决了,但也许你们都可以帮助我摆脱最初的陈规。
问题定义:
给出了一个由 N 个整数(都是正数)组成的无序且非唯一的序列 A。 A 的子序列是通过从 A 中删除任何元素、部分或全部元素而获得的任何序列。序列的幅度是该序列中最大元素和最小元素之间的差。假设空子序列的幅度为0。
例如,考虑由六个元素组成的序列 A:
A[0] = 1
A[1] = 7
A[2] = 6
A[3] = 2
A[4] = 6
A[5] = 4
如果数组 A 的幅度不超过 1,则称为准常数。在上面的示例中,子序列 [1,2]、[6,6] 和 [6,6,7 ] 是准常数。子序列[6,6,7]是A的最长可能的准常子序列。
现在,找到一个解决方案,给定一个由 N 个整数组成的非空零索引数组 A,返回数组 A 的最长准常数子序列的长度。例如,给定上述序列 A ,函数应该返回 3,正如解释的那样。
现在,我在 python 3.6 中使用没有类的基于排序的方法解决了这个问题(我的代码在下面),但我最初不想这样做,因为对大型列表进行排序可能会非常慢。看起来这应该有一个相对简单的公式作为广度优先的基于树的类,但我做错了。对此有什么想法吗?
我的基于无类排序的解决方案:
def amp(sub_list):
if len(sub_list) <2:
return 0
else:
return max(sub_list) - min(sub_list)
def solution(A):
A.sort()
longest = 0
idxStart = 0
idxEnd = idxStart + 1
while idxEnd <= len(A):
tmp = A[idxStart:idxEnd]
if amp(tmp) < 2:
idxEnd += 1
if len(tmp) > longest:
longest = len(tmp)
else:
idxStart = idxEnd
idxEnd = idxStart + 1
return longest
【问题讨论】:
-
你说“在大列表上排序可能很慢”,但排序有时间复杂度
O(n log n)并且高度优化。大多数树算法具有相同的时间复杂度并且没有被优化。为什么你认为树算法会比基于排序的算法更好? (一个好的基于排序的解决方案是排序后的O(n)。) -
我猜你说得很好。看来我肯定是想多了这个问题。
标签: python tree subsequence