我有一个25个随机整数的数组,介于-100到100之间。
例如我的数组看起来像这样: -10,23,19,-11,3,-9,-8,4,10,20,30,40,50,-6,-2,1,-9,8,-6,20,-21 ,-3,-2,-4,-7
我希望编写一个接收我的数组作为参数的方法,并打印出以下内容:第一个索引,最后一个索引,以及它们之间连续元素的总和,它们将给出可能的最大总和。 / p>
对于我的例子,输出将是:first index:1(value:23),last index:19(value:20),总和:177
我不知道应该如何处理这个问题。我编写了一个代码,但它非常复杂和低效,因为我使用了一个列表来存储所有可能的总和。 你能否为这个问题展示一个伪代码,或者用c#代码?
答案 0 :(得分:1)
这是文献中众所周知的问题,已知(在许多其他名称中)为最大子阵列问题。 您可以在此处找到更多信息和带有可能解决方案的伪代码:http://en.wikipedia.org/wiki/Maximum_subarray_problem
由于你的问题似乎是找到一个可行的算法并且没有实现它,所以下面的伪代码就足够了:
def max_subarray(A):
max_ending_here = max_so_far = 0
for x in A:
max_ending_here = max(0, max_ending_here + x)
max_so_far = max(max_so_far, max_ending_here)
return max_so_far
答案 1 :(得分:0)
您不需要保留所有可能的金额,因为您只对最大的金额感兴趣。
循环组合,并查找任何大于目前为止的总和。
您可以利用以下事实:任何元素范围的总和是除最后一个项目和最后一个项目之外的元素之和。即,您不需要遍历元素来计算每个可能的总和,因为您已经得到了一个元素的总和:
public static void ShowLargestSum(int[] arr) {
int largest = arr[0], start = 0, end = 0;
for (int i = 0; i < arr.Length; i++) {
int sum = 0;
for (int j = i; j < arr.Length; j++) {
sum += arr[j];
if (sum > largest) {
largest = sum;
start = i;
end = j;
}
}
}
Console.WriteLine("first index: {0} (value: {1}), last index: {2} (value:{3}), total sum: {4}", start, arr[start], end, arr[end], largest);
}
我的计算机上示例阵列的执行时间:0.17 ms。