给定一个数组,我想找到最大的子集元素,使得子集中最小和最大的元素小于或等于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中的解决方案比通用算法更可取。
例如,在数组[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中的解决方案比通用算法更可取。