python获得具有k个元素的数组的最大偶数和

时间:2020-08-22 15:24:21

标签: python arrays algorithm

我一直在研究python算法,并想解决一个问题:

  1. 给出了一个正整数数组A和一个整数K。
  2. 找到具有K个元素的数组A的最大偶数和。
  3. 如果不可能,请返回-1。

例如,如果存在一个数组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时,它失败了。 有没有简单的方法可以解决此问题?如果您能提供一些建议,我将不胜感激。

1 个答案:

答案 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)时间内运行。

相关问题