今天,王老师又给我们布置了一个结对开发项目的小课题,内容如下:
用一个一维数组随机存储n个数,然后求其子数组最大值。另外,要求时间复杂度为O(n)。其中,子数组表示k(k=1,2,3,······,n)个连续的数组元素所组成的数组。
对于这个问题,我们经过分析,得到了一些基本思路。
①首先,我们先考虑如何存储不同子数组的数据信息。在这里,我们采用链表的存储方式来存储数据。由于链表对应有头指针,因此在遍历链表时方便查找数据;而且,链表是顺序存储的,满足题目要求,方便建立不同的子数组。
②其次,我们要确定每个链表要存储的数据。首先我们要一个num[]数组,它用来存储当前所取的子数组的连续的下标。同时,还需要一个max值,用来存储经过比较后的子数组的最大值;最后还需要一个next指针。
③接下来,就是考虑如何求这个max值,又可以保证时间复杂度为O(n)。首先,我们不能使用循环嵌套,否则,时间复杂度会呈现非线性。在这里,我们考虑构造一个sort函数来筛选出max值,并将其存储到链表中去。这里定义的sort函数结构大致如下:
首先建立一个动态数组,如:int a[]=new int(m);//m表示数组大小
void sort(int m1,int *a,int n,*p)//m1表示数组大小,*a表示当前子数组起点的下标,n表示所取子数组中连续元素的个数,*p相当于链表的头指针
{
for(n=1;n<=m;n++){}//这里表示取间隔为n(n=1,2,3,······,m)的子数组
\\这里采用头插法来创建链表,同时赋予链表索要记录的数据num[]和max值
}
这时我们所创建的链表大致如下:
这样,便完成了这次程序。以上就是我们的思路和算法,可能中间存在一些缺陷和思路上的漏洞,我们会在以后的编程时加以完善和改进,谢谢!
信1205班
刘权毅
董文轩