【问题标题】:python getting the largest even sum of an array with k elementspython获得具有k个元素的数组的最大偶数和
【发布时间】:2020-12-11 17:25:04
【问题描述】:

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

  1. 给出一个正整数数组A和一个整数K。
  2. 找出数组 A 与 K 个元素的最大偶数和。
  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 时它失败了。 有什么简单的方法可以解决这个问题吗?如果您能给我一些建议,我将不胜感激。

【问题讨论】:

  • 重新检查new_A = [2, 3, 4, 4, 5]会发现陷入死循环,如果使用递归,需要保证下一步已经减少问题,所以这不会发生。

标签: python arrays algorithm


【解决方案1】:

对数组进行排序并“取”最大的 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) 时间运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多