浙大数据结构课程习题 Maximum Subsequence Sum 的C语言实现

浙大数据结构课程习题 Maximum Subsequence Sum 的C语言实现


博主是一个开学大三的非计算机专业学生,日后想跨考计算机。因为课内数据结构讲的感觉不过瘾,假期打算跟着浙大数据结构学一学,日后应该会对课程内的习题及知识在这里做一个记录。
回归正题,这个是老老实实自己写了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)(还没有想到怎么优化)。首先要判是否全负(第一次没看完题被这里卡了一下),然后如果当前子列和比最大子列和大,更新最后一位数。如果当前子列和为负,刷新数组,重新判断。

这个算法虽然复杂度高了点,不过运气好没有超时 = =

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值