8.9. 最大连续子段和,以及循环最大连续子段和。

8. 有一个包含n个元素的数组arr,计算最大的子段和(允许空段),即max(0, max_{i \leq j} \sum_{k=i}^j arr_k)

 

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;

        }
    }
}
View Code

 

posted @ 2014-01-28 15:14  Ligeance  阅读(579)  评论(0编辑  收藏  举报