最大子序列和及序列起始位置-全负数也适用-O(N)时间复杂度

有一个很经典的题目:给定一个整数组,求连续子序列的最大和,整数为正、负、0皆有可能。先考整数不是全负的情况,和最大的连续子序列,必然是以一个非负数开头,因为和加上一个负数,和变小,此外,和为负数的连续子序列,也不可能是目标子序列的开头的一段序列,因为如果目标序列起始的几个数为负,那么总可以通过将开头的这几个数去掉,这样目标序列的和更大。这种思路能得到一个算法复杂度为O(N)、空间复杂度为O(1)的...
摘要由CSDN通过智能技术生成
有一个很经典的题目:给定一个整数组,求连续子序列的最大和,整数为正、负、0皆有可能。

先考整数不是全负的情况,和最大的连续子序列,必然是以一个非负数开头,因为和加上一个负数,和变小,此外,和为负数的连续子序列,也不可能是目标子序列的开头的一段序列,因为如果目标序列起始的几个数为负,那么总可以通过将开头的这几个数去掉,这样目标序列的和更大。这种思路能得到一个算法复杂度为O(N)、空间复杂度为O(1)的算法。

有一些实现中,利用上述思路实现了算法,但是很多没有考虑数组的数全负的情况,在全负的情况下,最大子序列和会返回0,这样并没有完全实现题目要求。对于全负的情况,只要在遍历的同时,找到数组中最大的数字,这个最大数字就是最大连续子序列和。

考虑全负情况的实现如下:

/**********************
 * get maxium sum of the sub sequence
 * created by poetteaes
 * date: 2018-04-15
 ***********************/ 

# include <stdio.h>
# define MAX_ARR_LEN  100

int getMaxSum(int arr[], int N, int *maxSUm);

int main(void)  
{  
    int N;  
    int Arr[MAX_ARR_LEN];  
    int i;  
    int ret;
    int maxSum;
      
    /*input*/  
    printf("Please input an positive integer N which is betw
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值