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循环。这就是为什么它会无限期地运行。只需使用一个
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不是非递减顺序时,要回答所有值,请检查是否使用
您首先可以跟踪每个元素在字典中出现在
1 2 | counts = {x: b.count(x) for x in b} print sum(counts[x] for x in set(a).intersection(b)) |