算法第三章实践

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分钟打出来,一开始我们讨论要不要先判断正负,是两个相加还是三个相加。后来想到应该通过动态规划去解决问题,将大问题化为子问题,通过第一题的热身,立马就想到这段代码了。

③    对结对编程更加了解了,应该先独立思考,有想法互相讨论,最后一起编程。

猜你喜欢

转载自www.cnblogs.com/ReJay/p/9895660.html