谁能想到线性时间算法来确定元素列表中的多数元素?该算法应使用O(1)空间。
O(1)
如果n是列表的大小,则 多数元素 是至少出现ceil(n / 2)几次的元素。
ceil(n / 2)
[Input] 1, 2, 1, 1, 3, 2 [Output] 1
[编者注] 该问题存在技术错误。我宁愿离开它,以免破坏已接受答案的措辞,从而纠正错误并讨论原因。请检查接受的答案。
我猜想,Boyer- Moore算法(由nunes链接并由cldy在其他答案中描述)是该问题的预期答案。但是问题中“多数元素”的定义太弱,无法保证算法能够正常工作。
如果n是列表的大小。多数元素是至少发生ceil(n / 2)次的元素。
如果 存在这样的元素, 则 Boyer-Moore算法会找到具有 严格 多数的元素。(如果您事先不知道确实有这样一个元素,则必须再次遍历列表以检查结果。) __
对于严格的大多数,您需要“ …严格超过下限(n / 2)次”,而不是“ …至少大于ceil(n / 2)次”。
在您的示例中,“ 1”出现3次,其他值出现3次:
输入示例:1、2、1、1、1、3、2 输出1
输入示例:1、2、1、1、1、3、2
输出1
但您需要4个元素,且它们的值必须严格相等。
它确实在这种特殊情况下起作用:
输入:1、2、1、1、3、2 读取1:count == 0,因此将候选者设置为1,并将count设置为1 读取2:计数!= 0,元素!=候选值(1),所以递减计数为0 读取1:count == 0,因此将候选者设置为1,并将count设置为1 读取1:计数!= 0,元素==候选(1),所以将计数增加到2 读取3:计数!= 0,元素!=候选(1),因此将计数减为1 读取2:计数!= 0,元素!=候选值(1),所以递减计数为0 结果是当前候选:1
但是,如果将最后的“ 1”和“ 2”交换掉,会发生什么情况:
输入:1、2、1、2、3、1 读取1:count == 0,因此将候选者设置为1,并将count设置为1 读取2:计数!= 0,元素!=候选值(1),所以递减计数为0 读取1:count == 0,因此将候选者设置为1,并将count设置为1 读取2:计数!= 0,元素!=候选值(1),所以递减计数为0 读取3:count == 0,因此将候选者设置为3,并将count设置为1 读取1:计数!= 0,元素!=候选(3),因此将计数递减为0 结果是当前候选人:3