Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 子序列和的最小差_Python_Arrays - Fatal编程技术网

Python 子序列和的最小差

Python 子序列和的最小差,python,arrays,Python,Arrays,我有一个排序数组。我想把它分成两部分,使其中所有元素之和的差最小。例如,如果我有一个数组[1,4,9,16,25],我会把它分成S1=[1,9,16]和S2=[4,25],这样我就有了绝对最小差25+4-1+9+16=3,这是可能的最小值 l,r,i=0,0,n-1 while i>=0: if l<r: l+=arr[i] else: r+

我有一个排序数组。我想把它分成两部分,使其中所有元素之和的差最小。例如,如果我有一个数组[1,4,9,16,25],我会把它分成S1=[1,9,16]和S2=[4,25],这样我就有了绝对最小差25+4-1+9+16=3,这是可能的最小值

        l,r,i=0,0,n-1
        while i>=0:
            if l<r:
                l+=arr[i]
            else:
                r+=arr[i]
            i-=1

此代码弹出错误的答案。如何更正它?

解决此问题最简单、最简单的方法是使用动态规划-因为您无法预测下一次迭代中即将出现的数字,所以无法在每次迭代时决定应将当前数字添加到哪个数组中。这就是为什么你的解决方案不起作用,你的决定是迫不及待地做出的。要决定使用哪个阵列的当前编号,您应该熟悉整个原始阵列-要么做一些预处理工作,要么天真地检查所有可用的选项,称为暴力

我将尝试用伪代码演示如何使用动态编程解决此问题:

minDifferenceWrapper(arr) {
  return minDifference([], [], shallowCopy(arr))
}

minDifference(arr1, arr2, rest) {
  if rest.length == 0 -> return (arr1, arr2, calcDifference(arr1, arr2))
  
  nextNumber = rest.pop()
  option1 = minDifference(arr1.concat(nextNumber), arr2, shallowCopy(rest))
  option2 = minDifference(arr1, arr2.concat(nextNumber), shallowCopy(rest))

  // option1.diff is the returned value of calcDifference(arr1, arr2) 
  if option1.diff > option2.diff -> return option2 
  else return option1
}  
编辑 Python实现:

import copy


def min_difference_wrapper(arr):
    return min_difference([], [], copy.copy(arr))


def min_difference(arr1, arr2, rest):
    if len(rest) == 0:
        return arr1, arr2, abs(sum(arr1) - sum(arr2))

    next_number = rest.pop()
    new_arr1 = copy.copy(arr1) + [next_number]
    option1 = min_difference(new_arr1, arr2, copy.copy(rest))
    new_arr2 = copy.copy(arr2) + [next_number]
    option2 = min_difference(arr1, new_arr2, copy.copy(rest))

    if option1[2] > option2[2]:
        return option2
    else:
        return option1


print(min_difference_wrapper([1, 4, 9, 16, 25]))

您正在按顺序遍历数组。这样,只能生成分割阵列的结果。您首选的解决方案包括不按顺序排列的分区,即S2中的4个ist,但出现在S1中的9之前。我们需要了解更多信息:*如果是偶数长度,这两个部分的长度应该相同,如果是奇数长度,这两个部分的长度应该相差1?*该算法应该在特定的时间或空间复杂度下运行吗?此外,您应该向我们提供您想要实现的算法。请注意,该解决方案不能确保子数组长度的最小差异。可以有一个子数组包含3个元素,另一个子数组包含1个元素。是否需要?问题并没有说明数组长度应该相差最小