我正在寻找一种比暴力破解更有效的方法来查找具有非负和的数组的最长子数组。该数组中的数字范围从-5到5。
例如,如果您有一个数组A:
4 2 -5 3 0 -2 -2 -3 4 -4 -3 -2 1
则最长的非负子数组是
4 2 -5 3 0 -2 -2 -3 4,长度为9
我想到的解决方案是记录最佳解和最佳后缀,其中最佳后缀始终以检查的最后一个点A[i]结尾。如果最佳后缀比最佳解更长,则将最佳解更新为最佳后缀。
该后缀由介于两个正子数组之间的负子数组组成。因此,在这种情况下从左到右开始:
4 2是第一个正子数组 -5是负子数组 3 0 -2是第二个正子数组
然后程序检查两个正子数组的和是否大于负子数组。如果是,则整个最佳后缀成为新的第一个正子数组。如果不是,则丢弃第一个正子数组和负子数组,并将第二个正子数组变为第一个子数组,依此类推。
理论上,该程序应能够在线性时间内逐步检查最佳解。
但是,这个答案似乎是不正确的。
因此,我正在寻找更好的解决方案,或者至少是朝更好的方向的提示。
任何帮助都将不胜感激!
例如,如果您有一个数组A:
4 2 -5 3 0 -2 -2 -3 4 -4 -3 -2 1
则最长的非负子数组是
4 2 -5 3 0 -2 -2 -3 4,长度为9
我想到的解决方案是记录最佳解和最佳后缀,其中最佳后缀始终以检查的最后一个点A[i]结尾。如果最佳后缀比最佳解更长,则将最佳解更新为最佳后缀。
该后缀由介于两个正子数组之间的负子数组组成。因此,在这种情况下从左到右开始:
4 2是第一个正子数组 -5是负子数组 3 0 -2是第二个正子数组
然后程序检查两个正子数组的和是否大于负子数组。如果是,则整个最佳后缀成为新的第一个正子数组。如果不是,则丢弃第一个正子数组和负子数组,并将第二个正子数组变为第一个子数组,依此类推。
理论上,该程序应能够在线性时间内逐步检查最佳解。
但是,这个答案似乎是不正确的。
因此,我正在寻找更好的解决方案,或者至少是朝更好的方向的提示。
任何帮助都将不胜感激!