博主是一个开学大三的非计算机专业学生,日后想跨考计算机。因为课内数据结构讲的感觉不过瘾,假期打算跟着浙大数据结构学一学,日后应该会对课程内的习题及知识在这里做一个记录。
回归正题,这个是老老实实自己写了1个小时搞出来的代码,最开始想的是用一个flag判断是否是当前最大子列,无果。后来又想用多个数组保存多个子列,或者一个长度为n的数组保存,但是实现起来也没跑成…最后误打误撞发现其实根本不用考虑那么多,因为题目给的要求是只要数组第一个数与最后一个数,也不用保存整个数组(这就是不好好读题的后果hh),因此有了如下代码。
代码实现
#include<stdio.h>
#include<stdlib.h>
int main()
{
int allNeg=0, cnt, i, j, n, ThisSum, MaxSum, first=0, second=0; //first second 记录最大子列和数组头尾
scanf("%d", &n);
int* input = (int*)malloc(sizeof(int)*n);
int* MaxSumArr = (int*)malloc(sizeof(int)*n);
for ( i=0; i<n; i++ ) {
scanf("%d", &input[i]);
}
for ( i=0; i<n; i++ ) {
if ( input[i] < 0 ) {
allNeg++;
}
}
ThisSum = MaxSum = cnt = 0;
if ( allNeg != n ) {
for ( i=0; i<n; i++ ) {
ThisSum += input[i];
MaxSumArr[cnt] = input[i];
cnt++;
if ( ThisSum > MaxSum ) {
MaxSum = ThisSum;
first = MaxSumArr[0];
second = MaxSumArr[cnt-1];
} else if ( ThisSum < 0 ) {
ThisSum = 0;
for ( j=0; j<cnt; j++ ) {
MaxSumArr[j] = 0;
}
cnt = 0;
}
}
} else {
MaxSum = 0;
first = input[0];
second = input[n-1];
}
printf("%d ", MaxSum);
printf("%d ", first);
printf("%d", second);
return 0;
}
思路
这里用的是陈姥姥讲的在线处理的办法进行实现,增加了first和second变量去保存目标数组的首值和尾值,时间复杂度为 O ( n 2 ) O(n^2) O(n2)(还没有想到怎么优化)。首先要判是否全负(第一次没看完题被这里卡了一下),然后如果当前子列和比最大子列和大,更新最后一位数。如果当前子列和为负,刷新数组,重新判断。
这个算法虽然复杂度高了点,不过运气好没有超时 = =