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

该博客探讨了如何在全负数序列中找到最大子序列和及其起始位置,提出了一种算法,该算法在O(N)的时间复杂度内完成,且仅使用O(1)的空间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有一个很经典的题目:给定一个整数组,求连续子序列的最大和,整数为正、负、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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值