问题陈述:
给定N*N矩阵,矩阵中的每个单元包含警察或小偷。
找出被警察逮捕的小偷的数目。
警察只能逮捕一个小偷。
警察可以逮捕同一排的小偷。
警察可以在K范围内逮捕小偷(例如:如果K是1,那么3号牢房的警察只能在2号和4号牢房逮捕小偷)
输入:
3 1->这里3是N,1是K
吨/吨
T T P公司
P P T公司
输出:

我的解决方案因某些输入而超时:

1. Iterate each row and have two Treeset<Integer> to store position of police and thief
2. If current item is Police, then check if thief Treeset is Not empty,
   a.if so then iterate the treeset to find the position from thief set which
   can be removed(satisfying above criteria), remove thief from treeset and
   increment counter.
     a.1. If such item not available then add current position to police set
   b. if not then add position to police treeset

3. If current item is Thief, then do the same

在一行的迭代完成后,在下一行和最后一个打印计数器处迭代。
取一行的时间复杂度:
一。迭代行o(n)中的每个元素
2.从树集O(log(n))添加或删除元素
绝对需要超过o(n*log(n))
请让我知道这是一个什么样的问题,我应该如何有效地解决。

最佳答案

这似乎可以用贪婪的策略来解决您可以使用队列存储警察和小偷的索引,或者指针(一个指针表示警察,一个指针表示小偷)。
使用指针(或存储索引的变量),可以执行以下操作:
声明两个变量,例如policeIndexthiefIndex每行:
policeIndex移动到行中下一个警察的索引,并将thiefIndex移动到行中下一个小偷的索引。
比较policeIndexthiefIndex
3.1条。如果两者之间的绝对差值小于或等于k,则将逮捕次数增加一次。回到步骤2。
3.2条否则,根据更改的索引,将最低索引(policeIndexthiefIndex)移动到下一个警察或小偷。回到步骤3。
重复直到policeIndexthiefIndex到达行的末尾,然后转到下一行。
对于队列,您将执行基本相同的策略:用该类型的所有索引填充每个队列(警察和小偷);然后获取每个队列的第一个元素之间的差异,然后:如果它们的差异小于或等于k,则删除这两个元素并增加逮捕计数;否则从两个队列中删除最低索引,然后再次进行比较。重复此操作,直到任何队列为空。

10-04 21:00