子数组的最大和 最大子数组

/*
 * 求连续的子数组的和为最大数组及其和
 * 要求:
 * 1.只求子数组,不包含子数组为全集的情况
 * 2.本算法考虑了数组和一直递减趋势的情况
 * 3.本算法考虑了数组和一直递增趋势的情况
 * C# auto indent Ctrl+A -> Ctrl+K -> Ctrl+F
 * 
 * 
 * 
*/

using System;
using System.Collections.Generic;
using System.Text;

namespace Design_Pattern.Observer
{
    
public class MaxArray
    
{
        
private static int maxsum;
        
public static void Main(String[] args)
        
{
            
int[] array = 1-2310-472-5 };
            
//int[] array = { 1, -9, -10};
            
//int[] array = { 1, 0, 2 };
            int[] m = new int[array.Length];
            m[
0= array[0];
            List
<int> maxsubarray = new List<int>();
            MaxArray.findMaxSubArray(array, m, 
ref maxsubarray);

            Console.Write(
"max sub array:");
            
// 这里考虑m[0]时最大值的情况,即这个数组整体趋势递减
            if (maxsum == m[0])
            
{
                Console.Write(m[
0]);
            }

            
else
            
{
                
// 这里的maxsubarray不包含m[0]也可以为递增作贡献的情况 所以当数组为{ 1, 0, 2 }结果不正确
                
// 可加上这层处理
                foreach (int item in maxsubarray)
                
{
                    Console.Write(item 
+ " ");
                }

            }

            
            Console.ReadLine();
        }

        
public static void findMaxSubArray(int[] array, int[] m, ref List<int> maxsubarray)
        
{
            
// 包含子数组为全集 注意边界 不是array.Length-1
            int n = array.Length;
            m[
0= array[0];
            
for (int i = 1; i < n; i++)
            
{
                
if (m[i - 1< 0)
                
{
                    m[i] 
= array[i];
                }

                
else
                
{
                    m[i] 
= m[i - 1+ array[i];
                    maxsubarray.Add(array[i]);
                }


            }


            Console.WriteLine(
"the max sum for sub array:");
            Console.WriteLine(MaxArray.GetArrayMax(m));

            Console.WriteLine(
"new sum array m:");
            
foreach (int item in m)
            
{
                Console.Write(item 
+ " ");

            }

            Console.WriteLine();
        }


        
public static int GetArrayMax(int[] array)
        
{
            
int max = array[0];
            
foreach (int  item in array)
            
{
                
if (item > max)
                
{
                    max 
= item;
                }

            }

            maxsum 
= max;
            
return max;
        }

    }

}

posted @ 2008-05-30 10:33  晓岚  阅读(953)  评论(2编辑  收藏  举报