【发布时间】:2016-08-16 02:09:04
【问题描述】:
大家! 长度为 n 的序列中的一个元素如果在序列中出现严格超过 n/2 次,则称为多数元素。
此代码问题的目标是检查输入序列是否包含多数元素。
我正在尝试使用归并排序算法来解决这个问题
我的策略:
排序序列,使用合并算法
-
在排序列表中查找每个元素的出现。如果大于 n/2,则返回 1。由于列表已排序,我想遍历列表,如果下一个元素与前一个不同,则计数器停止并将其与 n/2 进行比较
def merge(left,rigt): result = [] i = j = 0 while i < len(left) and j < len(rigt): if left[i] <= rigt[j]: result.append(left[i]) i += 1 else: result.append(rigt[j]) j += 1 result += left[i:] result += rigt[j:] return result def merge_sort(a): if len(a) <= 1: return a middle = len(a)//2 left = a[:middle] right = a[middle:] left = merge_sort(left) right = merge_sort(right) return list(merge(left,right)) def get_major_element(a,n): k = 1 for i in range(0,len(a)-1): if a[i] == a[i+1]: k += 1 if k > n/2: return 1 else: return 0 if __name__ == '__main__': input = sys.stdin.read() data = list(map(int, input.split())) n = data[0] a = data[1:] m = merge_sort(a) print (get_major_element(m,n))
我得到的结果是无效的。 我想,我可以在没有初始排序的情况下做到这一点,但我不知道应该重写哪一步!有人可以帮忙吗?
【问题讨论】:
-
您没有使用
sorted或list.sort的任何特殊原因?我想这是一个任务。如果作业是关于排序的,你应该在你的问题中说明(这样我们就不会提出不同的方法);如果它不是关于排序并且您只是使用排序来解决问题,则只需使用 bultin sort 函数。 -
另外,您是否尝试过使用
collections.Counter(the_list).most_common(1)? -
有一个众所周知的标准算法可以在数组和 O(1) 空间上一次通过即可解决这个问题。 cs.utexas.edu/~moore/best-ideas/mjrty/example.html