该问题已在链接中讨论过。 Find the majority element in array
我知道有更多优化的解决方案,但我无法理解下面讨论的方法。顺便说一下,它是一个未排序的阵列。
二进制搜索树的节点(在此方法中使用)如下。
struct tree
{
int element;
int count;
}BST;
"在BST中逐个插入元素,如果元素已经存在,则递增节点的计数。 "在任何阶段,如果节点的计数变得超过n / 2,则返回。 该方法适用于在数组的起始处存在n / 2 + 1个多数元素的情况,例如{1,1,1,1,1,2,3,4}。
如果我们将元素逐个传递给函数,我们如何比较元素是否已存在并增加计数?
答案 0 :(得分:0)
首先,struct应该有指向子节点的指针。一些事情
struct node{
int value;
int count;
node *leftChild;
node *rightChild;
};
要在BST中插入元素,请检查当前节点是大于还是小于或等于您要插入的元素。如果它更小,则向左移动,如果它更大,则向右移动,如果相等则增加该节点的计数字段。如果到达空节点(休假的子节点),则在此位置使用您要插入的值创建一个新节点,并将计数设置为1.
最后有两个变量来跟踪多数元素及其发生的次数,并在插入元素时根据需要更新它们。
假设多数元素确实出现了n / 2或更多次,您不需要额外的变量,但是如您的引用中所述,只要将节点计数器递增为> = n,就可以返回/ 2。因此,无论何时递增计数器,都要与n / 2进行比较。
正如您所指出的,如果任务真的只是最终了解多数元素,那么有更好的解决方案,但我认为您希望坚持BST方法。