首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >求最大跨度(i,j)的最快算法,使得,ai + ai+1 +....+aj = bi +数组a和b中的bi+1 +....+bj

求最大跨度(i,j)的最快算法,使得,ai + ai+1 +....+aj = bi +数组a和b中的bi+1 +....+bj
EN

Stack Overflow用户
提问于 2011-11-03 19:27:21
回答 2查看 2.1K关注 0票数 0

我在准备考试时遇到了这个问题。

给定两个数字数组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))时间。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-03 20:23:32

如果有人愿意做正确的检查,我能想到的唯一解决方案是O(n^2)和omega(n)时间。如果有人设法利用所有为0和1的值,它可能会得到改进。

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2013-02-01 02:03:29

这是一个O(n)算法,

代码语言:javascript
运行
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7994101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档