zoukankan      html  css  js  c++  java
  • 数组问题(二)求环形数组子数组和的最大值

      这个问题相对于上个问题又复杂了一步,主要在于如何判断 最大子数组和是否在数组首尾处,那么可以选择分情况讨论,最后选择最大值解决

      可以分两个情况:


      1.和最大子数组没有跨过数组首尾

       此时可以使用上一个程序的方法


      2.和最大子数组跨过数组首尾

       此时选择 数组总和-最小子数组和得到最大子数组和


      最后通过比较两个和的大小选择实际和大小.

      程序代码:

    //可以分两个情况
    //1.和最大子数组没有跨过数组首尾
    //    此时可以使用上一个程序的方法
    //2.和最大子数组跨过数组首尾
    //    此时选择 数组总和-最小子数组和得到最大子数组和
    //最后通过比较两个和的大小选择实际和大小
    
    #include<iostream>
    using namespace std;
    int main()
    {
        int i,num,Max2Sum,result;
        cout << "请输入数组元素个数: " ;
        cin >> num;
        int *arr = new int[num];
        cout << "请依次输入数组元素" << endl;
        for (i = 0; i < num; i++)
        {
            cin >> arr[i];
        }
        int Sum=0;
        int temp=0 ;
        int CurSum=0;
        int MaxSum=0;
        int MinSum=0;
        for (i = 0; i<num; i++)
        {
            //第二种情况,求得最大值为Sum-MinSum
            Sum+=arr[i];
            if (temp>0)
            {
                temp=arr[i];
            }
            else
            {
                temp=temp+arr[i];
            }
            if (temp<MinSum)
            {
                MinSum=temp;
            }
            //第一种情况,求得最大值为CurSum
            CurSum+=arr[i];
            if(CurSum>MaxSum)
            {
                MaxSum=CurSum;
            }
            if(CurSum<0)
            {
                CurSum=0;
            }
        }
        Max2Sum=Sum-MinSum;
        if(CurSum>Max2Sum)  //较大的为最大值
        {
            result=CurSum;
        }
        else
        {
            result=Max2Sum;
        }
        cout <<"该数组中最大子数组的和是: "<< result<<endl;
        system("pause");
        return 0;
    }

      程序运行截图(对比上一次程序):

      另一个实验数据:

  • 相关阅读:
    jQuery的动画效果
    jQuery的event事件
    设计模式 命令行模式
    桥接模式
    享元模式
    代理模式
    门面模式
    代理模式
    python基础-abstractmethod、__属性、property、setter、deleter、classmethod、staticmethod
    库存负数
  • 原文地址:https://www.cnblogs.com/zzcs/p/5326221.html
Copyright © 2011-2022 走看看