import sys
def get_majority_element(arr):
if len(arr) < 2:
return arr[0]
midpoint = len(arr) // 2
left = arr[:midpoint]
right = arr[midpoint:]
majority_left = 0
majority_right = 0
temp_left = get_majority_element(left)
if temp_left != None:
majority_left = temp_left
temp_right = get_majority_element(right)
if temp_right != None:
majority_right = temp_right
counterLeft = 0
counterRight = 0
for x in range( len(arr) ):
if arr[x] == majority_left:
counterLeft+=1
elif arr[x] == majority_right:
counterRight+=1
if counterLeft > len(arr) // 2:
return majority_left
#return 1
elif counterRight > len(arr) // 2:
return majority_right
#return 1
else:
return 0
input = sys.stdin.read()
n, *arr = list(map(int, input.split()))
result = get_majority_element(arr)
print(result)
****免责声明:该代码解决了问题并通过了所有测试用例。但是......返回声明中有一个我无法弄清楚的错误。现在,它将正确返回任何数组中的多数元素。
但是,如果用返回的语句替换当前的返回语句(返回1),则返回值不是1.这怎么可能呢? 不知何故,返回1变为0,因为它返回到调用者函数?
输入: 5
2 3 9 2 2
输出:2
以下是分而治之的方法: 假设您有数组a = [2 3 9 2 2]。你将它分成b1 = [2 3]和b2 = [9 2 2]。然后将b1分成b11 = [2]和b12 = [3]。然后返回2和3,并在b1中计算它们的出现次数。
如果在b1中发生的次数多于(n / 2 = 2/2 = 1)次,则它们是b1的多数元素。否则,b1不包含多数元素,并返回0.然后,程序将使用与上面相同的过程以递归方式分割b2。然后它将看到b2中的多数元素为2,并计算其在a中出现的次数,得出结论它在a中发生的次数超过(n / 2 = 5/2 = 2)次,因此它占多数元件。
答案 0 :(得分:0)
非常简单:当您从所有来电中返回1或0时,您将使用 majority_left 和 majority_right 中的每一个的两个值中的一个达到顶级。当你在列表中查找1和0时,没有。
即使您将这些作为项目计数,您也会在顶层返回失败,因为1 + 1不大于5 // 2.