我一直在研究python算法,并想解决一个问题:
例如,如果存在一个数组A = [1,2,3,4,4,5]且K = 3, 答案是12(5 + 4 + 3), 这是K(3)个元素的最大偶数和。 但是,如果A = [3,3,3]并且K = 1, 答案是-1,因为它不能与一个元素求和。
我试图从数组中排除每个最小的奇数,但是当while循环中的K = n时,它失败了。 有没有简单的方法可以解决此问题?如果您能提供一些建议,我将不胜感激。
答案 0 :(得分:3)
对数组进行排序,并“获取”最大的K个元素。
如果已经是总数了-您就完成了。
否则,您需要精确地替换一个元素,将您选择的偶数元素替换为您没有的奇数元素,或者反之。您需要将这两个元素之间的差异最小化。
一个幼稚的解决方案将检查所有可能的方法,但这是O(n^2)
。通过检查实际的两个可行的候选者,您可以做得更好:
选择两个元素之间的差异最小的那个。如果不存在这两个元素(即您的k = 3,[3,3,3]示例),则没有可行的解决方案。
时间复杂度为O(nlogn)
。
在我(非常生锈)的python中,它应该类似于:
def FindMaximalEvenArray(a, k):
a = sorted(a)
chosen = a[len(a)-k:]
not_chosen = a[0:len(a)-k]
if sum(chosen) % 2 == 0:
return sum(chosen)
smallest_chosen_even = next((x for x in chosen if x % 2 == 0), None)
biggest_not_chosen_odd = next((x for x in not_chosen[::-1] if x % 2 != 0), None)
candidiate1 = smallest_chosen_even - biggest_not_chosen_odd if smallest_chosen_even and biggest_not_chosen_odd else float("inf")
smallest_chosen_odd = next((x for x in chosen if x % 2 != 0), None)
biggest_not_chosen_even = next((x for x in not_chosen[::-1] if x % 2 == 0), None)
candidiate2 = smallest_chosen_odd - biggest_not_chosen_even if smallest_chosen_odd and biggest_not_chosen_even else float("inf")
if candidiate1 == float("inf") and candidiate2 == float("inf"):
return -1
return sum(chosen) - min(candidiate1, candidiate2)
注意:这样做可以做得更好(就时间复杂度而言),因为您实际上并不关心所有元素的顺序,只需查找“候选”和前K元素。因此,您可以使用选择算法而不是排序,这样可以在O(n)
时间内运行。