在重新学习数据结构,看完最大子序列算法后赶紧跑去leetcode重新实现一遍。
O(n)的高级方法比 O(nlogn)的分冶为之的方法实现起来简单多了可是跑起代码来却有些bug。。 先留着明天看答案去...
class Solution(object):
def maxSubArray(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
a = (nums[0],nums[0]) #课件里这里是初始化为0,并且循环是for i in range(len(nums))
(MaxSum, ThisSum) = a
for i in range(len(nums)-1):
ThisSum += nums[i+1]
if ThisSum>MaxSum:
MaxSum = ThisSum
elif ThisSum<0:
ThisSum = 0 # abandon it if ThisSum is negative, which cannot make help to the latter subsequences
return MaxSum
* [-1]作为输入序列时最大子序列不能返回0 //那大概是要返回-1咯
*这份代码跪在了[-2,1]这个sample上
hah,题目有(containing at least one number)这个要求。于是加上一个判断就好啦//并没有看答案喔哈哈哈哈
class Solution(object):
def maxSubArray(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
a = (0,0)
(MaxSum, ThisSum) = a
flag = 0
maxnum = nums[0]
for i in range(len(nums)):
ThisSum += nums[i]
if nums[i]>maxnum:
maxnum = nums[i]
if ThisSum>=MaxSum:
MaxSum = ThisSum
flag = 1
elif ThisSum<0:
ThisSum = 0 # abandon it if ThisSum is negative, which cannot make help to the latter subsequences
if flag == 0 :
return maxnum
else:
return MaxSum
* 吃完饭再实现下 divide and conquer approach分而治之的方法~
没吃饭敲代码敲到现在!!bug居然是递归调用时没有self.function 而直接调用了function!!!
啪啪啪自己的脸呐( ̄ε(# ̄)☆╰╮( ̄▽ ̄///)
那。代码如下啦~
(感觉酱紫刷题会刷出胃病来的。。。。
class Solution(object):
def maxSubArray(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
L = len(nums)
if L == 1 :
return nums[0]
elif L > 1:
mid = L/2
leftmax = self.maxSubArray(nums[:mid])
rightmax = self.maxSubArray(nums[mid:])
midsum1 = 0
midsum2 = 0
midmax1 = nums[mid]
midmax2 = nums[mid]
for i in range(mid,-1,-1):
midsum1 += nums[i]
if midsum1>midmax1:
midmax1 = midsum1
for i in range(mid,L,1):
midsum2 += nums[i]
if midsum2>midmax2:
midmax2 = midsum2
midmax = max(midmax1,midmax2)
if midmax>0:
if min(midmax1,midmax2)>0:
midmax = midmax + min(midmax1,midmax2) - nums[mid]
Thismax = max(leftmax,rightmax,midmax)
return Thismax
else:
print "nums is empty"
return -1