代码问世Day 19的问题规定如下:
编号为1到N的精灵坐成一圈。每个精灵带来礼物。 然后,从第一个精灵开始,他们轮流偷走所有的精灵 从精灵到左边的礼物。一个没有礼物的精灵 从圆圈中移除并且不轮流。所以,如果N = 5,那么:
- 精灵1带着精灵2的礼物。
- Elf 2没有礼物而被跳过
- Elf 3带着Elf 4的礼物。
- Elf 4没有礼物也被跳过。
- Elf 5收集Elf 1的两件礼物。
- Elf 1和Elf 2都没有礼物,所以都跳过了。
- Elf 3收录了Elf 5的三个礼物,结束了比赛。
谁最终得到N的一般情况的所有礼物?
解决了这些问题之后,我总是喜欢看其他的解决方案来学习一些新的技巧。我读过的其中一个解决方案是Peter Norvig的解决方案here,我注意到他提到从列表中删除每个提出礼物的精灵是O(N ^ 2)。
根据经验,这是有道理的,因为这基本上就是我所做的,我的解决方案非常缓慢,但我认为从列表中删除,假设链表,是O(N)(或特别是O(N)迭代到点删除,O(1)实际删除)。
我的知识显然缺乏,如果有人能帮助我更好地理解这是O(N ^ 2),我将不胜感激。我可以看一下,如果你要删除,然后在每次删除之后,尝试再次从列表的开头搜索下一个精灵,那是因为在这种情况下你每次删除的成本是N和N再次搜索下一个精灵所以N ^ 2总计。我正在做的是保持计数器列表中的位置,删除精灵,然后将计数器迭代到下一个位置。在这种情况下,我希望删除N成本,但不能用于索引(可能这是我错了,索引成本)。