首页 > 试题广场 >

连续子数组的最大和(二)

[编程题]连续子数组的最大和(二)
  • 热度指数:46548 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
输入一个长度为n的整型数组array,数组中的一个或连续多个整数组成一个子数组,找到一个具有最大和的连续子数组。
1.子数组是连续的,比如[1,3,5,7,9]的子数组有[1,3],[3,5,7]等等,但是[1,3,7]不是子数组
2.如果存在多个最大和的连续子数组,那么返回其中长度最长的,该题数据保证这个最长的只存在一个
3.该题定义的子数组的最小长度为1,不存在为空的子数组,即不存在[]是某个数组的子数组
4.返回的数组不计入空间复杂度计算

数据范围:



要求:时间复杂度,空间复杂度
进阶:时间复杂度,空间复杂度


示例1

输入

[1,-2,3,10,-4,7,2,-5]

输出

[3,10,-4,7,2]

说明

经分析可知,输入数组的子数组[3,10,-4,7,2]可以求得最大和为18,故返回[3,10,-4,7,2]   
示例2

输入

[1]

输出

[1]
示例3

输入

[1,2,-3,4,-1,1,-3,2]

输出

[1,2,-3,4,-1,1]

说明

经分析可知,最大子数组的和为4,有[4],[4,-1,1],[1,2,-3,4],[1,2,-3,4,-1,1],故返回其中长度最长的[1,2,-3,4,-1,1]   
示例4

输入

[-2,-1]

输出

[-1]

说明

子数组最小长度为1,故返回[-1]   
很多答案空间复杂度都不过关
class Solution:
    def FindGreatestSumOfSubArray(self , array: List[int]) -> List[int]:
        # write code here
        maxval = array[0]
        temp = array[0]  # 序列累加
        endindex = 1
        beginindex = 0
        for i in range(1, len(array)):
            if temp < 0:
                temp = array[i]
                beginindex = i
            else:
                temp += array[i]
            if temp >= maxval:
                endindex = i
                maxval = temp
        # begin > end 表示 序列全为负
        # begin不断累加, 但此时end已保存最大值索引
        if beginindex > endindex:
            return array[endindex:endindex + 1]
        return array[beginindex:endindex + 1]
                


发表于 2021-12-08 11:00:40 回复(1)
根据JZ42小改一下:
时间复杂度O(n),那就允许一个循环。
dp是一个与list同规模的列表,dp[i]存放从list[0]到list[i]和最大 的列表 的和;
start,end是dp[i]对应的list的上下标
max_start,max_end是dp对应的最大的和的上下标。
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param array int整型一维数组 
# @return int整型一维数组
#
class Solution:
    def FindGreatestSumOfSubArray(self , array: List[int]) -> List[int]:
        # write code here
        dp = [i for i in array]
        start,end = 0,1
        max_start,max_end = 0,1
#         max_sum = 0
#         df1 = [list(i) for i in array]

        for i in range(1,len(array)):
            
            dp[i] = max(dp[i-1]+array[i],array[i])
            if dp[i-1]+array[i] >= array[i]:
                end += 1
            else:
                start,end = i,i+1
            if sum(array[start:end]) > sum(array[max_start:max_end]):
                max_start,max_end = start,end
            if sum(array[start:end]) == sum(array[max_start:max_end]):
                if len(array[start:end])> len(array[max_start:max_end]):
                    max_start,max_end = start,end
            else:
                max_start,max_end = max_start,max_end
        return array[max_start:max_end]


发表于 2021-12-04 15:55:24 回复(0)