给定一个数组,我想查找元素的最大子集,使得子集的最小和最大元素小于或等于K分开。具体来说,我想要的是元素,而不仅仅是大小。如果有多个事件,则可以匹配任何事件。阵列中最大的子集,使得最小和最大的元素分开小于K
例如,在数组[14,15,17,20,23]
中,如果K为3,则可能的最大子集为[14,15,17]
。如果将17替换为16,也是一样。还应该匹配多个元素,例如[14,14,14,15,16,17,17]
。数组不一定是排序的,但它可能是排序它的一个很好的起点。元素不一定是整数,子集不一定在原始数组中连续 - 我只是想要发生最大的可能子集。
为了更清楚地说明理想的结果,一个简单的方法是首先对数组进行排序,迭代排序数组的每个元素,然后创建一个新数组,包含当前元素,该元素被扩展后包含每个元素当前元素< = K大于它。 (即在上面的第一个例子中,如果当前元素为20,那么该数组将被扩展为[20,23],然后停止,因为数组的末尾已到达;如果当前元素为15,则数组将被扩展到[15,17],然后停止,因为20比15大3以上)。然后这个数组与当前的最大值进行检查,如果它更大,则将取代当前的最大值。当前的最大值是最大的子集。 (在最大子集是数组的情况下,这种方法的复杂度为O(N^2)。)
我意识到这种天真的方法,并且这个问题是要求优化的算法。
虽然我可以使用一般算法运行,但Python中的解决方案更可取。
您应该使用自定义[后缀树](https://hkn.eecs.berkeley.edu/~dyoo/python/suffix_trees/)。 – Kasramvd
值是否始终为整数? – samgak
@samgak不,他们不一定是整数。 – ChiCubed