求最大连续子序列的和

今天看到一道绿盟的面试题。感觉比较有意思,放在这里给大家分享一下。原文如下:

小王的账本:小王出门打零工,工作很不稳定,收入也很不稳定,他找了一个账本记录他每天的支出,例如:

1月1日 收入320;

1月2日 没找到工作,吃饭花了30;

1月3日 挣50;

1月4日 无工作,吃饭花了17;

1月5日 无工作,租房+吃饭花了2600;

..........

年底了,小王想知道自己账本上哪一段时间挣钱挣的最多。

设计并实现算法帮助小王得到他挣钱最多的时间段和这段时间所挣到的钱(数据条数<1000,算法时间/空间复杂度尽可能小),并给出算法的时间/空间复杂度。

--------------------------------------------------------------------------------------------------------------

刚开始看到这道题,没大明白,后来看明白了,觉得蛮有意思的。其实就是求最大连续子序列的和

/*
求最大连续子序列的和
描述:有一整数序列X,长度为N,从中连续的选出n个数使这n个数的和最大,并指出和最大时,这n个数在原序列中的下标范围
*/

#include<stdio.h>
#define N 10 //假设N为365
int main(void)
{
	int i, a[N],sum;
	int start, end;
	printf("please input the value of N numbers\n");
	for ( i = 0; i < N; i++)
	{
		scanf("%d", &a[i]);
	}
	int max = a[0];//将最大值先定义为第一个数
	start = 0;//默认范围就是第一个数
	end = 0;//默认范围就是第一个数
	for (i = 0; i < N; i++)
	{
		sum = 0;
		for (int j = i; j < N; j++)
		{
			sum += a[j];
			if (max < sum)
			{
				max = sum;
				start = i;//和最大时,开始的那个数
				end = j;//和最大时,结束的那个数
			}
		}
	}
	printf("最大连续子序列的和为%d\n", max);
	printf("范围为第%d---第%d个数\n", start + 1, end + 1);//从1开始数

	return 0;
}

这样算的话,会有几个问题。

1:如上所示,其实1-8天和1-10天的和的结果是一样的,最后输出只输出了第一种情况。

2:如果序列中,有几个不同子序列的和都是最大的,最后也智能输出最开始的那个最大子序列。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值