有一个包含(正数和负数)整数的数组A
。查找(连续)子数组的元素绝对总和最小的,例如:找到子阵列的最小绝对总和
A = [2, -4, 6, -3, 9]
|(−4) + 6 + (−3)| = 1 <- minimal absolute sum
我已经通过实施蛮力算法,这是O(N^2)
或O(N^3)
开始,但它产生正确的结果。但任务规定:
complexity:
- expected worst-case time complexity is O(N*log(N))
- expected worst-case space complexity is O(N)
一些搜索我想,也许Kadane的算法可以被修改,以适应这个问题,但我没能做到这一点之后。
我的问题是 - 卡丹的算法是否正确?如果不是的话,你能否指出我的方向是正确的(或者说一个能够帮助我的算法)?我不想要一个现成的代码,我只需要帮助找到正确的算法。
我不关注如何识别部分和的子数组。例如数组[-4,5,-1]有部分和[-4,1,0],这似乎意味着子数组应该是[5,-1] = 4,而实际的解决方案是[-4,5,-1] = 0。 – Benubird 2015-06-11 12:55:29
我没有考虑整个阵列,被认为是一个子阵列。您可以分别考虑具有小部分和的子数组,或者在排序所有内容时确保包含具有零元素的子数组 - 这有一个零和,因此在您的示例中,您将得到部分和[-4, 1,0,0],然后找出解决方案,该解决方案考虑到两个零和相加的项之间的跨度 - 整个阵列的开始和结束。从两个部分总和中识别出来的子阵列是部分总和中的项目集合,其中大部分项目相加但不在另一个项目中。 – mcdowella 2015-06-11 18:00:52
考虑3,3,3,4,5?也许我很困惑。 – Catalyst 2015-12-14 18:41:50