• 42. 连续子数组的最大和


    问题:输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。

    解题思路:

    1.本来我想的是用二维数组的动态规划方法:用s[i][j]表示从第i个元素到第j个元素之间的所有子数组的和的最大值

    我在初始化二维数组s的时候遇到了一些麻烦,我初始化的方法如下:

    s = [[0]*length]*length,其中length是输入的整形数组的长度,经过一番调试发现这种初始化二位数组存在问题,经过上网搜查一番https://blog.csdn.net/qq_1290259791/article/details/81009164,发现了问题所在:

    a = [[]]*3
    a[0].append(1)
    a[1].append(2)
    a[2].append(3)
    print(a)
    
    输出为[[1, 2, 3], [1, 2, 3], [1, 2, 3]]

    原因是创建一个列表,然后复制三个,相当于二维数组中,引用的是同一个一位数组。意思就是:a = [[b]]*3只是创建了3个指向b的应用,所以一旦b改变,a中的3个列表也会改变。

    生成方法更改为:

    b = [[] for i in range(3)]
    b[0].append(1)
    b[1].append(2)
    b[2].append(3)
    print(b)

    输出为[[1], [2], [3]]

    可以查看列表的id就知道了:

    a = [[]]*3
    a[0].append(1)
    a[1].append(2)
    a[2].append(3)
    print(id(a[0]))
    print(id(a[1]))
    print(a)
    
    输出为:
    4489350984
    4489350984
    [[1, 2, 3], [1, 2, 3], [1, 2, 3]]
    
    
    b = [[] for i in range(3)]
    b[0].append(1)
    b[1].append(2)
    b[2].append(3)
    print(id(b[0]))
    print(id(b[1]))
    print(b)
    
    输出为:
    4489370184
    4489370056
    [[1], [2], [3]]

     经过修改后我的代码如下(显然不能解决本问题):

    class Solution:#该方法不能确保是连续的子数组!
        def maxSubArray(self, nums: List[int]) -> int:
            length = len(nums)
            s = [[0] * length for _ in range(length)]
            for i in range(length):
                s[i][i] = nums[i]   
            for i in range(length-2,-1,-1):
                for j in range(i+1,length):
                    s[i][j] = max((nums[i]+s[i+1][j]),(s[i][j-1]+nums[j]),s[i+1][j],s[i][j-1])
            return s[0][length-1]

     该问题只需要一位数组的动态规划方法即可解决:

    class Solution:
        def maxSubArray(self, nums: List[int]) -> int:
            dp = len(nums)*[0]
            dp[0]=nums[0]
            for i in range(1,len(nums)):
                dp[i]=max(nums[i],dp[i-1]+nums[i])
            return max(dp)
  • 相关阅读:
    OpenSSH免密码登录SSH2
    mysql_init调用卡住原因分析
    磁盘文件读性能测试
    madvise、fadvise、posix_madvise和posix_fadvise函数的使用
    进程间传递文件描述符fd
    Orace开源的异步IO编程库,特点是接口非常简单
    爱奇艺视频窗口显示不出来解决办法
    brk/sbrk和mmap行为分析程序
    编译boost,去掉不使用的组件
    第24课 经典问题解析二
  • 原文地址:https://www.cnblogs.com/USTC-ZCC/p/12550530.html
Copyright © 2020-2023  润新知