关于Python:Python – 匹配两个非递减数组

Python - Matching two non-decreasing arrays

我正在研究以下问题:注意:代码在0.4秒的时间限制下工作,这需要O(N+M)解决方案你的朋友给了你一个n个正整数的列表:a0,a1,a2,…A-1,按递增顺序。

现在,你的朋友会问你m个问题,每个问题的形式,"这是一个正整数b,b是列表的一部分吗?(b按非递减顺序排列)

你的任务是回答这些问题。输出一个整数,即您说"是"的次数。

输入格式:输入的第一行将包含整数n。

输入的第二行将包含n个正整数,即列表A,按递增顺序排列。

下一行输入将包含整数m,即问题数。

接下来的m行输入将每个包含一个非递减的整数b,这是您的朋友问您的正整数。

输出格式:输出应该包含一个整数,即您说"是"的次数。

这是我的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
n = int(raw_input())
a = [int(x) for x in raw_input().split()]
m = int(raw_input())
b = []
for y in range(0, m):
    b.append(int(raw_input()))

answer = 0
i = 0
j = 0
z = 1

while (i < n) and (j < m):
    if a[i] == b[j]:
        answer = answer + 1
        while ((z + j) < m):
            if a[i] == b[j + z]:
                answer = answer + 1
                z = z + 1
            elif a[i] != b[j + z]:
                i = i + 1
                j = j + z + 1
    elif a[i] < b[j]:
        i = i + 1
    elif a[i] > b[j]:
        j = j + 1

print answer

正如代码可能建议的那样,我正在尝试使用一种方法来比较数组A和数组B中的项,如果它们不匹配,请将一个项添加到数组索引中较小的项。但是,代码没有输出正确的答案,有时会循环不断地向我请求无限数量的输入。

我是一个编程初学者,我知道这是一个非常基本的算法。我对任何不够清楚或技术性的陈述表示歉意。

谢谢您。


我不会在这里使用while循环。这就是为什么它会无限期地运行。只需使用一个for循环。另外,在Python语言中还有一些非常好的特性,允许您比自己遍历整个列表更快地完成这项工作。

1
2
3
4
5
6
7
8
9
10
11
12
13
In [6]: count = 0

In [7]: a = [1, 2, 3, 4, 5, 100]

In [8]: b = [1, 3, 1000, -10, 12]

In [9]: for val in b:
   ...:     if val in a:
   ...:         count += 1
   ...:

In [10]: print count
2

Julien Bernu有一个更优雅的想法:

1
2
3
a = set([1, 2, 3, 4, 5, 100])
b = set([1, 3, 1000, -10, 12])
print len(a.intersection(b))


谢谢大家的帮助。@greg@julienbernu我改进了我的原始逻辑代码并解决了这个问题。解决方案为O(n+m),所有输入在0.25秒内工作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
n = int(raw_input())
a = [int(x) for x in raw_input().split()]
m = int(raw_input())
b = []
for y in range(0, m):
    b.append(int(raw_input()))

answer = 0
i = 0
j = 0

while (i < n) and (j < m):
    if a[i] == b[j]:
        answer = answer + 1
        j = j + 1
    elif a[i] < b[j]:
        i = i + 1
    elif a[i] > b[j]:
        j = j + 1

print answer

或者,当b不是非递减顺序时,要回答所有值,请检查是否使用all(b[i] <= b[i + 1] for i in xrange(m-1))对列表b进行排序。如果不进行排序,请使用我以前使用的二进制搜索方法作为O(mlog(n))的解决方案。


您首先可以跟踪每个元素在字典中出现在b中的次数:

1
2
counts = {x: b.count(x) for x in b}
print sum(counts[x] for x in set(a).intersection(b))