【发布时间】:2013-01-12 21:04:22
【问题描述】:
现在我有 N 个不同的整数,我需要在 O(NlogN) 时间内找到一个具有最多数值的区间,其值在区间的端点之间。我称其为“分而治之”问题,因为它属于我期末考试的“分而治之”类别。我已经考虑了 2 周并做了很多实验,但没有一个是正确的(与蛮力算法相比)。有人可以帮我吗?
例子:
8,1,3,4,7。答案是 1-7。
2,6,5,4,9,8。答案是 2-9 或 2-8。
我认为“间隔”这个词并不能表达我的意思。我的意思是找到数组的子序列,它的值在子序列的端点之间的数字最多。 eg.1:“1,3,4,7”有两个数字(3,4),eg.2:“2,6,5,4,9”和“2,6,5,4,9”都有,8" 有三个数字(6,5,4)。
这是我的代码 (O(n^2))。 @Vaughn Cato 我用它来与您的代码进行比较。
#! /usr/bin/env python
#coding=utf-8
import itertools
def n2(numbers):
a = [0]*len(numbers)
ans = -1
l = 0
r = 0
for j in range(1,len(numbers)):
t = 0
for i in range(j-1,-1,-1):
if numbers[i]<numbers[j]:
x = t - a[i]
if x>ans:
ans = x
l = i
r = j
t += 1
else:
a[i] += 1
return (numbers[l],numbers[r],ans)
def countBetween(numbers,left,right):
cnt = 0
for i in range(left+1,right):
if numbers[left]<numbers[i]<numbers[right]:
cnt += 1
return cnt
for numbers in itertools.permutations(range(5)):
ans1=n2(numbers)
ans2=longestInterval(numbers)
if(ans1[2]!=ans2[2]):
print ans1,ans2,numbers
【问题讨论】:
-
如果您已经使用了 2 周,您可能已经尝试了一些东西。欢迎分享。
-
向我们展示您的代码、预期解决方案的问题示例,并告诉我们您未提及的任何问题详细信息/限制。
-
间隔有什么限制吗?否则你可以在 O(1) 中输出 [MIN_INT, MAX_INT]。
-
据我了解,您的问题是找到整数列表的最小值和最大值。合并排序(具有 O(N.log(N)) 复杂度),你就完成了......我认为它没有那么简单,所以清楚地解释你的主题
-
对不起,我已经简化了这个问题,所以我的代码不明确。我希望这些例子能解释清楚。
标签: algorithm divide-and-conquer