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个小时。

                  

  • 相关阅读:
    常用设计模式:装饰者模式
    常用数据结构算法 : 堆排序
    常用数据结构算法:二叉树的最近公共祖先
    java网络通信:HTTP协议 之 Sessions与Cookies
    java网络通信:HTTP协议
    常见的设计模式:工厂模式
    Java基础:类加载机制
    一个C++右值引用的问题
    剖析一个用C++写的行情交易系统
    C++ Coroutine简明教程
  • 原文地址:https://www.cnblogs.com/w123456qaz/p/9786863.html
Copyright © 2011-2022 走看看