8. 有一个包含n个元素的数组arr,计算最大的子段和(允许空段),即。
9. 有一个包含n个元素的首尾相连的环形数组arr,计算最大的子段和(允许空段)。
样例:数组[1, 3, -2, 6, -1],最大子段和应该为9,对应的子段为[6, -1, 1, 3]。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication8 { class Program { static void Main(string[] args) { int[] inputArr = { 1, -2, 3, 10, -4, 7, 2, -5 }; int[] inputArr2 = { 1, 3, -2, 6, -1 }; Console.WriteLine(MaxSumSubArray(inputArr)); Console.WriteLine(MaxSumSubLoopArray(inputArr2)); } static int MaxSumSubArray(int[] input) { if (input == null || input.Length == 0) { throw new Exception("input can't be empty."); } int result = 0; int sum = 0; for (int i = 0; i < input.Length; i++) { if (sum <0) { sum = 0; } sum += input[i]; if (sum > result) { result = sum; } } if (result == 0) { result = input[0]; for (int i = 0; i < input.Length; i++) { if (input[i]>result) { result = input[i]; } } } return result; } static int MaxSumSubLoopArray(int[] input) { int[] intArr = new int[input.Length*2]; for (int i = 0; i < input.Length; i++) { intArr[i] = input[i]; intArr[i + input.Length] = input[i]; } int count = 0; int sum = 0; int result = 0; for (int i = 0; i < intArr.Length; i++) { sum = 0; count = 0; for (int j = i; j < intArr.Length; j++) { if (sum<0||count==input.Length-1) { break; } sum += intArr[j]; count++; if (sum>result) { result = sum; } } } return result; } } }