首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

求一组数中连续的几个数之和最大值

Posted on 2008-03-13 09:30  停留的风  阅读(2067)  评论(2编辑  收藏  举报
给定一组数,有正有负,求连续的几个数之和的最大值?用程序设计实现。这是一道面试题目,鄙人只是总结了两种方法,如果朋友你有更好的方法来解决这个问题,希望你能回复,与大家分享一下。
    /// <summary>
    
/// 最笨的方法
    
/// </summary>
    
/// <param name="a"></param>
    
/// <returns></returns>

    public int getMax(int[] a)
    
{
          //不能定义max为0
        
int max=a[0],temp=0;      

        
if (a.Length == 0)
        
{
            max 
= 0;
            
return max;
        }

        
if (a.Length == 1)
        
{
            max 
= a[0];//或者为0,如果一个元素也不取
            return max;
        }
       
        
for (int i = 0; i < a.Length; i++)
        
{           
            
for (int j = i; j < a.Length; j++)
            
{
                temp 
= temp+a[j];
                
if (temp > max)
                
{
                    max 
= temp;
                }
               
            }

            temp 
= 0;
        }

        
return max;
    }

    
/// <summary>
    
/// 第二种方法 将相邻的正数和零、负数整合成一个数,最后再比较
    
/// 这样做,最糟糕的就是怕集合的元素都是正负交替出现
    
/// </summary>
    
/// <param name="a"></param>
    
/// <returns></returns>

    public  int SegetMax(int[] a)
    
{
        
int max = a[0],temp=0, plusTemp = 0,negTemp=0;

        
int i=0,j=0;
        List
<int> list = new List<int>();
        
if (a.Length == 0)
        
{
            max 
= 0;
            
return max;
        }

        
if (a.Length == 1)
        
{
            max 
= a[0];
            
return max;
        }

        
while (i<a.Length)
        
{
            
if (a[i] >= 0)
            
{
                
while (j < a.Length&&a[j] >= 0)
                
{
                    plusTemp 
= plusTemp + a[j];
                    j
++;
                }

                i 
= j;
                list.Add(plusTemp);
                plusTemp 
= 0;

            }

            
else if (a[i] < 0)
            
{
                
while (a[j] < 0 && j < a.Length)
                
{
                    negTemp 
= negTemp + a[j];
                    j
++;
                }

                i 
= j;
                list.Add(negTemp);
                negTemp 
= 0;
            }

        }

        
for (int p = 0; p < list.Count; p++)
        

            
for (int k = p; k < list.Count; k++)
            
{
                temp 
= temp + list[k];
                
if (temp > max)
                
{
                    max 
= temp;
                }

            }

            temp 
= 0;
        }

        
return max;
    }
第二种方法最后验证是错误的。int[] a ={ -1000000,-1,-3,-8728272,-8383828,-009993939 };
如果是这样,这种算法就存在问题,看来思路还是短路了。