zoukankan      html  css  js  c++  java
  • 软件工程概论课堂作业2

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

    要求:

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

    数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大值。

    要求时间复杂度为O(n)

    发表一篇博客文章讲述设计思想,出现的问题,可能的解决方案(多选)、源代码、结果截图、总结。

    设计思想

    用户自定义数组长度并依次输入数组元素,设数组为a[N];

    1.因为是求一个数组子数组的最大值,所以应从数组第一个不为零的元素累加,设累加值为S,为判断数组第一个不为负的元素,S需要初始化为零;

    2.定义另一个整形变量sum存储当前最大累加值S,sum需与累加值比较,所以sum应初始化为零  (1)每一次累加获得一个S后判断,若S为负,舍去使累加值为负的数组元素,继续从下一个数组元素开始累加(2)若sum<S,把S赋值给sum,S继续累加(3)如此循环直到数组元素取尽。

    3.最后输出的sum为子数组最大值。

    出现的问题

    数组元素全为负的时候不能得出正确结果。

    可能的解决方案:

    遍历所有子数组的可能情况比较大小,但是不满足时间复杂度为O(n)。

    程序源代码

    //Jiang LingJun,   2016,04,06

    //数组中有正有负,求最大子数组问题

    #include<iostream>

    using namespace std;

    int a[10000];//全局变量(初始化数组a所有元素为零)

    void main()

    {

      int i,m;

      int sum=0;//初始化

      int s=0;

      cout<<"请输入数组长度 ";

      cin>>m;

      cout<<"请输入"<<m<<"个数:";//自定义数组长度

      for(i=0;i<m;i++)

        cin>>a[i];

      for(i=0;i<m;i++)

        {

          if(s<0)

            s=a[i];//舍去使子数组和小于零的数组元素

          else

            s=s+a[i];//临时存放数组元素的累加值

          if(sum<s)

            sum=s;//存放当前最大子数组的和

        }

       cout<<"该数组子数组和的最大值为:"<<sum<<" ";

    }

     运行结果截图

    总结

    代码看着比较简单,但逻辑思路一定要理清。注意全局变量与局部变量的区别。

  • 相关阅读:
    [LeetCode] 67. 二进制求和
    [LeetCode] 66. 加一
    [LeetCode] 65. 有效数字
    [LeetCode] 63. 不同路径 II
    [LeetCode] 64. 最小路径和
    [LeetCode] 61. 旋转链表
    [LeetCode] 62. 不同路径
    [LeetCode] 59. 螺旋矩阵 II
    [LeetCode] 60. 第k个排列
    [LeetCode] 58. 最后一个单词的长度
  • 原文地址:https://www.cnblogs.com/jianglingjun/p/5369341.html
Copyright © 2011-2022 走看看