• 软件工程课堂练习2


    2013年3月10日上午11:00

    题目:输入一个整型数组,数据元素有正数也有负数,求元素组合成连续子数组之和最大的子数组,要求时间复杂度为O(n)

    这是我们这一次是测试内容。刚刚老师耐心的给我们讲解了什么是子数组,这是非常经典的一道题。想要实现这个程序不难,只是能够很巧妙的把时间复杂度降为O(n)才是解题的关键。

    下面是我们结对pair的初级设计思路:

    1、键盘输入数组个数、数组元素。用cin实现

    2、实现一个for循环,找到以数组中第一个数为首的子数组的和

    定义一个变量sum并赋一个初值作为子数组的和,在定义一个max实现子数组最大值的存储

    刚开始想着定义一个数组add[]来放子数组和,然后通过子数组和的大小比较来实现max的查找。后来发现设置的子数组最大值查找时没有嵌套进循环而使max一直等于a[0].

    后来两人协商之后,决定直接用sum来作为子数组和,经过两个嵌套循环,内层for循环实现从i=j+1到i=n的子数组和sum的计算,通过if实现max和sum的比较,把较大的值赋给max。循环出来的就是a[0]为子数组第一个元素的max值。

    3、外层嵌套一个for循环,经过j=0到j=n的遍历,找到最终结果max

    4、输出结果

    分析过程如下:

    下面是我们的代码: 

    #include<iostream>
    using namespace std; 
    int main(int argc, char* argv[])
    {
        int a[10];
        int max=a[0];
        int i,j,n,sum=0;
        cout<<"输入数组个数:"<<endl;
        cin>>n;
        cout<<"输入数组元素:"<<endl;
    
        for(i=0;i<n;i++)
        {
            cin>>a[i];
        }
        for(j=0;j<n;j++)
        {
            sum=a[j];
            for(i=j+1;i<n;i++)
            {    
                sum=sum+a[i];
                if(max<sum)
                max=sum;
            }
        }
        cout<<max;
        
        return 0;
    }

     这个程序只是单纯的实现了求最大子数组和功能,时间复杂度是O(n^2),还不是很理想,有很大的改进空间。不过经历这次结对编程,也使我和我的小伙伴关系更好了一些,处理问题有了更高层次的提升,遇见问题,讨论问题,解决问题。我们一定会做的越来越好的。

  • 相关阅读:
    Linux操纵体系备份工具Tar运用说明
    Linux琐屑网络设置细致分解
    若何制造Linux系统启动盘2
    RedHatAS5下整合Apache和Tomcat
    移除Linux体系下不需求的效劳
    Linux平安隐患及增强管理的方法1
    Fedora 9 布置好后启动不克不及进入GUI,表现屏表现“Out Of Range"的处理惩罚法子
    Linux和Unix最常用的收集下令
    若何彻底移除编造机Wine模仿程式的图标
    若何制造Linux系统启动盘1
  • 原文地址:https://www.cnblogs.com/mengdi/p/3592594.html
Copyright © 2020-2023  润新知