题目
大型派对要选出幸运人士,一字排开,从左到右点数,凡是奇数都淘汰,如此往复,只剩下一个人为止。
分析
依据分治思想,每次队列都是相同的操作,加上递归,问题就容易解决了。
T(n) = T(n/2) + θ(1);
所以复杂度为logn;
c++代码如下
Node* LuckMan(Node* head)
{
int flag = 1;
Node* l = head;
if (l->next->next == NULL)
{
return head;
}
else
{
while (l->next != NULL)
{
if (flag % 2 != 0)
{
Node* l1 = l->next;
l->next = l->next->next;
delete l1;
l1 = NULL;
}
else
{
l = l->next;
}
flag++;
}
return LuckMan(head);
}
}
删除操作频繁发生,链表用起来方便。