• 结对开发之求任意一个数组的最大子数组


    一.题目:

     返回一个整数数组中最大子数组的和。

      要求:

      1.输入一个整形数组,数组里有正数也有负数。

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

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

    二.设计思想。

    将接收的数组放到a[i],将接收的数组中的所有子数组的和放到b[i]中,然后找出最大值max,即为该数组的最大子数组和。

    将最大值的脚标放到s[i]中,求出 最大子数组的首个数字的脚标s[i],与连续相加数字的个数t[i]。

    三.代码。

    #include<iostream.h>
    #define MAX 10000
    int main()
    {
        int k,t[MAX],o=0,d=0;
        int n=0,m=0;
        int b[MAX],a[MAX];
        int s[MAX];
        cout<<"请输入数组中整数的个数:"<<endl;
        cin>>k;
        for(int i=0;i<k;i++)
        {
            cin>>a[i];
        }
        for(int l=1;l<k+1;l++)
        {
            for(i=0;i<k-l+1;i++)
            {
                for(int j=i;j<i+l;j++)
                {
                    if(j>k-1)
                    {
                        break;
                    }
                    else
                        m=m+a[j];
                }
                b[n]=m;
                m=0;
                n=n+1;
            }
        }
        int max=b[0];
        for(i=1;i<n;i++)
        {
            if(max<b[i])
                max=b[i];
        }
        for(i=0;i<n;i++)
        {
            if(max==b[i])
            {
                s[d]=i+1;
                d++;
            }
            
        }
        int r=k;
        for(i=0;i<d;i++)
        {
            t[i]=0;
            for(int j=0;j<k;j++)
            {
                if(s[i]>=r&&r>=0)
                {
                    s[i]=s[i]-r;
                    t[i]=t[i]+1;
                    r=r-1;
                }
                if(s[i]==0&&r>0&&j!=k-1)
                {
                    s[i]=s[i]+r+1;
                    break;
                }
                if(s[i]==0&&r==0&&t[i]==k)
                {
                    s[i]=s[i]+1;
                    break;
                }
            }
            r=k;
        }
        cout<<"该数组中的最大子数组的和为:"<<max<<endl;
        cout<<"这样的子数组一共有"<<d<<""<<endl;
        for(i=0;i<d;i++)
        {
            s[i]=s[i]-1;
        }
        for(i=0;i<d;i++)
        {
            if(d==1)
                cout<<"该子数组为:"; 
            else
                cout<<""<<i+1<<"组子数组为:";
            if(t[i]==0)
            {
                t[i]=1;
            }
            for(int j=s[i];j<s[i]+t[i];j++)
            {
                cout<<a[j]<<"   ";
            }
            cout<<endl;
        }
        return 0;    
    }

    四.运行结果。

    五.体会。

    结对开发可以使得小组有更多的设计思路,可以拓展每个人的思路,从中找出更加简便的算法,有问题时两个人可以互相讨论,更好地解决问题。

    当一个人编程时,另外的人可以从旁观者的角度更好的能发现一些问题。避免自己编程时出现问题,找不出问题原因。

    结对开发最好的方面就是使得程序更加优化。

    六.工作照片。

  • 相关阅读:
    解决eclipse自动格式化影响svn提交的问题
    XShell下载安装并连接阿里云
    阿里云服务器购买选择
    三线程循环打印ABC流程解释
    eclipse个人开发较常用的快捷键
    eclipse调试的一些技巧
    Java序列化与反序列化
    vmware vsphere添加磁盘,不重启检测
    win10国内生态-恶心的经历
    本地win10 vmware 虚拟机centos7系统初始化网络配置
  • 原文地址:https://www.cnblogs.com/nulidexuezha/p/4351361.html
Copyright © 2020-2023  润新知