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
既然无论如何时间都会过去,为什么不选择做些有意义的事情呢
浙公网安备 33010602011771号