zoukankan      html  css  js  c++  java
  • 求最大子数组之和

    要求:

    要求程序必须能处理1000个元素;

    每个元素是int32类型的,出现子数组之和大于整型表示的最大范围会出现什么情况;

    输入一个整形数组,数组里有整数也有负数;

    数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和;

    求所有子数组的和的最大值,要求时间复杂度为O(n)。

    第一段处理1000个元素:

     1 #include<iostream>
     2 #include<stdlib.h>
     3 #include<time.h>
     4 using namespace std;
     5 int main()
     6 { 
     7     int n,star=0,end=0;         //n表示整型数组长度,star表示最大子数组起始位,end表示最大子数组终止位
     8     cout<<"输入整型数组的长度:";
     9     cin>>n;
    10     int *p=new int[n];
    11     srand((unsigned)time(NULL));
    12     for(int i=0;i<n;i++)     
    13     { 
    14         p[i]=rand()%2000-1000; //随机取-1000~1000中的整数
    15     }                          
    16     for(int i=0;i<n;i++)
    17     { 
    18         cout<<p[i]<<"  ";     //输出这1000个元素
    19         if((i+1)%10==0)        //每十个换行
    20         {
    21             cout<<endl;
    22         }
    23     }
    24     int sum=p[0];              //子数组
    25     int max_sum=p[0];          //最大子数组
    26     for(int i=1;i<n;i++)
    27     {   
    28         if(sum>0)              //从第二个数开始判断是否为正数
    29         { 
    30             if(p[i]>(INT_MAX-sum))           //加入了一段判断int类型数据是否溢出。
    31             {
    32                 cout<<"int类型溢出"<<endl;
    33                 return 0;
    34             }
    35             sum=sum+p[i];       //是正数,将和值(初始值为p【0】)和第i+1个数做和。
    36             if(sum>max_sum)     // 并判断是否为最大,是让其赋值给max_sum,并将子数组末位置改变。
    37             { 
    38                 max_sum=sum;
    39                 end=i;
    40             }
    41         }
    42         else 
    43         { 
    44             sum=p[i];          //是负数,将第i+1个数的值赋值给和值sum
    45             if(sum>max_sum)    //并判断是否为最大,是让其赋值给max_sum,并将子数组初、末位置改变。
    46             {    
    47                 max_sum=sum;
    48                 star=i;
    49                 end=i;
    50             }
    51         }
    52     }
    53     cout<<"最大子数组位置为第"<<star+1<<"个到第"<<end+1<<""<<endl;
    54     cout<<"最大子数组和为"<<max_sum<<endl;
    55     return 0;
    56 }

    第二段溢出情况:

    #include<iostream>
    #include<stdlib.h>
    #include<time.h>
    using namespace std;
    int main()
    { 
    	int n,star=0,end=0;         //n表示整型数组长度,star表示最大子数组起始位,end表示最大子数组终止位
        cout<<"输入整型数组的长度:";
        cin>>n;
        int *p=new int[n];
        srand((unsigned)time(NULL));
        for(int i=0;i<n;i++)     
        { 
    		p[i]=rand()%2000-1000; //随机取-1000~1000中的整数
                    p[i]=p[i]*1000000;     //把随机数扩大10^6倍
        }                          
        for(int i=0;i<n;i++)
        { 
            cout<<p[i]<<"  ";     //输出这1000个元素
            if((i+1)%10==0)        //每十个换行
            {
    			cout<<endl;
            }
        }
        int sum=p[0];              //子数组
        int max_sum=p[0];          //最大子数组
        for(int i=1;i<n;i++)
        {   
            if(sum>0)              //从第二个数开始判断是否为正数
            { 
                if(p[i]>(INT_MAX-sum))           //加入了一段判断int类型数据是否溢出。
                {
                    cout<<"int类型溢出"<<endl;
                    return 0;
                }
                sum=sum+p[i];       //是正数,将和值(初始值为p【0】)和第i+1个数做和。
                if(sum>max_sum)     // 并判断是否为最大,是让其赋值给max_sum,并将子数组末位置改变。
                { 
    				max_sum=sum;
                    end=i;
                }
            }
            else 
            { 
    			sum=p[i];          //是负数,将第i+1个数的值赋值给和值sum
                if(sum>max_sum)    //并判断是否为最大,是让其赋值给max_sum,并将子数组初、末位置改变。
                {    
    				max_sum=sum;
                    star=i;
                    end=i;
                }
            }
        }
    	cout<<"最大子数组位置为第"<<star+1<<"个到第"<<end+1<<"个"<<endl;
        cout<<"最大子数组和为"<<max_sum<<endl;
        return 0;
    }
    

      

           结果只复制了结果,看到了提出int类型溢出。

    总结:主要操作方法是借鉴别人的,然后两人一起在宿舍调试,最后出来结果。预计4个小时,实际上花了大概5个小时。

                  

  • 相关阅读:
    POJ 2175 Evacuation Plan 费用流 负圈定理
    POJ 2983 Is the Information Reliable? 差分约束
    codeforces 420B Online Meeting
    POJ 3181 Dollar Dayz DP
    POJ Ant Counting DP
    POJ 1742 Coins DP 01背包
    中国儒学史
    产品思维30讲
    Java多线程编程核心技术
    编写高质量代码:改善Java程序的151个建议
  • 原文地址:https://www.cnblogs.com/w123456qaz/p/9786863.html
Copyright © 2011-2022 走看看