• LeetCode Easy: 53. Maximum Subarray


    一、题目

    Find the contiguous subarray within an array (containing at least one number) which has the largest sum.

    For example, given the array [-2,1,-3,4,-1,2,1,-5,4],
    the contiguous subarray [4,-1,2,1] has the largest sum = 6.

    题目是说,给你一串数,有正有负 要求出最大的连续子串

    二、解题思路

    目前感觉自身还是硬编码,还没有建立算法思想,拿到题首先想到的还是逐个遍历,内层再定义一个变量 j ,记录当前元素 i ,所能组合的符合条件的最大长度,题目并没有要求输出最大数的子串,但为了锻炼下,我用了一个字典来存储当前元素的符合条件的最大子串和值。整个算法的复杂度我感觉差不多到O(n*n)了,提交上去之后,系统显示超时了。搜了搜网上的做法,发现自己的太low了,这道题大家普遍用的是动态规划的思想,基本思路:在每一步我们都需要维护两个变量,一个是全局最优,就是到当前元素为止的最优的解;一个是局部最优解,就是必须包含当前元素的最优解。其复杂度应该是O(n),只需要遍历一次数组即可。

    #coding:utf-8
    import time
    def maxSubArray1(nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        maxnums = -float('inf')
        dict = {}
        for i in range(len(nums)):
            j = i + 1
            while j <= len(nums):
                b = [nums[j] for j in range(i,j)]
                if sum(b) > maxnums:
                    maxnums = sum(b)
                    dict.update({maxnums:nums[i:j:1]})
                    #print(dict)
                j+=1
        print(maxnums)
        print("the biggest nums's is",dict[maxnums])
        return maxnums,dict[maxnums]
    
    def maxSubArray2(nums):
        thissum = 0
        maxsum = -float('inf')
    
        for i in range(len(nums)):
            if thissum < 0:
                thissum = 0   #归零表示当前的sum为负,越加越小,这里thissum = 0表示当前的num[i]
            thissum += nums[i]
            maxsum = max(maxsum, thissum) #全局最大值
        print(maxsum)
        return maxsum
    
    def maxSubArray3(nums): 
        l = g = -float('inf')  #这里应该初始化为无穷小
        for n in nums:
            l = max(n, l + n)  #l中存的是局部最大值
            g = max(l, g)   #g中存在的是全局最大值
        print(g)
        return g
    
    if __name__ == '__main__':
        a = [-2,1,-3,4,-1,2,1,-5,4]
        starttime1 = time.clock()
        maxSubArray1(a)
        endtime1 = time.clock()
        print("maxSubArray1 cost time is %d."%(endtime1 - starttime1))
        starttime2 = time.time()
        maxSubArray2(a)
        endtime2 = time.time()
        print("maxSubArray2 cost time is %d." % (endtime2 - starttime2))
        maxSubArray3(a)
        starttime3 = time.time()
        endtime3 = time.time()
        print("maxSubArray3 cost time is %d." % (endtime3 - starttime3))

    博客参考:https://blog.csdn.net/linhuanmars/article/details/21314059

                      https://www.cnblogs.com/xbf9xbf/p/4240510.html

    既然无论如何时间都会过去,为什么不选择做些有意义的事情呢
  • 相关阅读:
    java_方法
    Java switch case和数组
    Java流程控制语句
    Java变量和运算符
    Java对象和类
    Java基础语法
    Vmare12(虚拟机)安装Mac OS X Yosemite 10.10
    System Operations on AWS
    System Operations on AWS
    System Operations on AWS
  • 原文地址:https://www.cnblogs.com/xiaodongsuibi/p/8651414.html
Copyright © 2020-2023  润新知