标签:不用 相加 时间复杂度 个数 复杂 原来 变量 心得体会 分析
1、 实践题目:最大子段和
2、 问题描述:给定n个整数(可能为负数)组成的序列a[1]a[2]……a[n],求该序列如a[i]+a[i+1]……a[j]的子段和最大值。当所给的整数均为负数时,定义子段和为0.要求算法时间复杂度为O(n)。
3、 算法描述:最大子段和化为子问题,两个相邻的数字在相加,不加两种情况下哪种方式能得到最大值。将i与i+1位置的数字相加,并与i、i+1两个数字比较,将最大值保留在i+1。此时设一个变量x,用于存储最大值,每次相加比较后就与x比较,最大值赋予x。即x=max(a[i],a[i+1],a[i]+a[i+1]),最后输出x。
4、 算法时间和空间复杂度分析:
时间:T(n)=O(n)+O(n)=O(n)
空间:分配了n个数组和变量i,则为O(n)
5、 心得体会:
① 程序改进:我这种代码会改变原来数组中的值,要是加多一个功能可能就比较麻烦继续计算。可以设多一个数组用来存放运算结果,这样就不用改变数组中的值。
② 我懂得了应该先想算法思想,再去套进题目中。这道题我们只花了15分钟打出来,一开始我们讨论要不要先判断正负,是两个相加还是三个相加。后来想到应该通过动态规划去解决问题,将大问题化为子问题,通过第一题的热身,立马就想到这段代码了。
③ 对结对编程更加了解了,应该先独立思考,有想法互相讨论,最后一起编程。
标签:不用 相加 时间复杂度 个数 复杂 原来 变量 心得体会 分析
原文地址:https://www.cnblogs.com/ReJay/p/9895660.html