我在准备考试时遇到了这个问题。
给定两个数字数组a1,...,an和b1,....,bn,其中每个数字为0或1,找到最大跨度(i,j)的最快算法,ai + ai + 1 + .... + aj = bi + bi + 1 + .... + bj或报告没有这样的跨度。
(A)如果允许散列,则需要O(3 ^ n)和omega(2 ^ n)时间。
(B)在关键比对模式中取O(n ^ 3)和omega(n ^ 2.5)和时间
(C)取theta(n)时间和空间
(D)仅当2n个元素的总和为偶数时才取O(平方根(n))时间。
答案 0 :(得分:1)
我能想到的唯一解决方案是O(n ^ 2)和omega(n)时间,如果有人不愿做正确的检查。如果任何人设法找到利用所有值为0和1的方法,它可能会得到改善。
int[] a = { 1, 1, 0, 1, 1, 0, 1, 0, 1 };
int[] b = { 0, 1, 0, 0, 1, 1, 0, 1, 0 };
int lastSum = 0; int lastI = 0; int lastJ = 0;
int sumA = 0; int sumB = 0;
for(int i = 0; i < a.Length; i++) // start the sum at [i].
{
sumA = a[i]; sumB = b[i];
for (int j = i + 1; j < a.Length; j++) // summing ends on [j]
//do
{
if (sumA == sumB && (lastJ - lastI < j - i))
{
lastSum = sumA;
lastI = i; lastJ = j;
if (j == a.Length - 1) // you will never find a bigger interval.
{
Console.Out.WriteLine("(i, j) = (" + lastI + ", " + lastJ + ")");
return;
}
}
sumA += a[j];
sumB += b[j];
}
}
Console.Out.WriteLine("(i, j) = (" + lastI + ", " + lastJ + ")");
答案 1 :(得分:1)
这是一个O(n)算法,
l=[1,1,1,1,0,1,0,1,1,0,1,0,0,0,1,1,1,1,0]
m=[0,0,0,0,1,0,1,1,1,0,0,0,1,1,1,0,0,0,1]
delta=[]
for i in range(0,len(l)):
delta.append(l[i]-m[i])
leftsum=[0]
for i in range(1,len(l)+1):
leftsum.append(leftsum[i-1]+delta[i-1])
sumHash=[-1]*len(l)
maxLen=0;
leftIndex=-1
rightIndex=-1
for i in range(0,len(l)+1):
if sumHash[leftsum[i]]!=-1:
if maxLen<i-sumHash[leftsum[i]]:
maxLen=i-sumHash[leftsum[i]]
leftIndex=sumHash[leftsum[i]]
rightIndex=i-1
else:
sumHash[leftsum[i]]=i
print 'len=',maxLen,'left=',leftIndex,'right=',rightIndex