【发布时间】:2019-09-01 07:44:13
【问题描述】:
我们有一个整数数组X。任务是返回一个相同大小的数组Y,其中Y 中的ith 元素是X 中具有ith 元素的子数组的最大计数。
例如:
X: [8, 7, 1, 12, 11, 4, 10, 2, 3, 6, 9]
Y: [3, 2, 1, 32, 7, 1, 10, 1, 2, 3, 4]
这是我的二次时间复杂度解决方案。
def solve(A):
def expand(i):
left, right = i, i
while left > 0 and A[i] >= A[left - 1]:
left -= 1
while right < len(A) - 1 and A[i] >= A[right + 1]:
right += 1
length = right - left + 1
mid = i - left
return (mid + 1) * (length - mid)
result = [0] * len(A)
MOD = 10**9 + 7
for i in range(len(A)):
count = expand(i)
count %= MOD
result[i] = count
return result
我们的想法是,当元素大于当前元素时,我们使用两个指针向左和向右移动。一旦我们有了当前元素最大的数组,我们就可以通过(start_index) * (end_index - start_index + 1)得到子数组的数量
算法必须在非常大的测试用例上运行。如何将时间复杂度降低到至少NlogN?
【问题讨论】:
-
X 值是否都不同?