1、没什么想法啊,看看答案叭
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
# 设f(i)是以i结尾的最大和连续子数组的和
#我们的目标是找到max{f(i)}
#f(i)=max{f(i-1)+nums[i],nums[i]}
p = nums[0]
n = len(nums)
if len(nums)==1:
return nums[0]
for i in range(1,n):
r = max(p+nums[i],nums[i])
result = max(p,r)
p = r
return result
不知道哪里有问题
我的妈呀。。。。
2、順便看了下sublime如何調試
不太會用,放棄了。
3、
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
# 设f(i)是以i结尾的最大和连续子数组的和
#我们的目标是找到max{f(i)}
#f(i)=max{f(i-1)+nums[i],nums[i]}
p = nums[0]
n = len(nums)
result = p
if len(nums)==1:
return nums[0]
for i in range(1,n):
r = max(p+nums[i],nums[i])
result = max(result,r)
p = r
return result
整体思路没有问题,只是刚刚是在比较p和r的最大值,其实要比较的是之前所有f的最大值和现在的f的值,用result记录到目前为止f的最大值。
这图画的真的很不错!!!!
有环的情况可以分类讨论。
(1)没有跨界
就和53题一样
(2)跨界
找两端最大的,就相当于找没跨界的最小的。
设f(i)是到第i个的连续最小和
则f(i)=min{f(i-1)+nums[i],nums[i}
3、还是不多,
class Solution:
def maxSubarraySumCircular(self, nums: List[int]) -> int:
n = len(nums)
if len(nums)==1:
return nums[0]
#没有跨界
p = nums[0]
n = len(nums)
result_f = p
for i in range(1,n):
r = max(p+nums[i],nums[i])
result_f = max(result_f,r)
p = r
max_f=result_f
#跨界
q = nums[0]
result_t_1 = q
for i in range(1,n-1):
s = min(q+nums[i], nums[i])
result_t_1 = min(result_t_1,s)
q = s
max_t_1 = sum(nums)-result_t_1
q = nums[0]
result_t_2 = q
for i in range(2,n):
s = min(q+nums[i], nums[i])
result_t_2 = min(result_t_2,s)
q = s
max_t_2 = sum(nums)-result_t_2
return max(max_f,max_t_1,max_t_2)
4、debug后发现先问题:
为了不让全部用来输出最小值,又因为是连续的,所以我限制其最多从第一个开始连续到倒数第二个;或者从第二个开始连续到最后一个。
但是在写从第二个开始连续的时候,忘记更改最左侧值为第二个nums[1],最左侧值值还是第一个nums[0】,导致错误,修改如下:
class Solution:
def maxSubarraySumCircular(self, nums: List[int]) -> int:
n = len(nums)
if len(nums)==1:
return nums[0]
#没有跨界
p = nums[0]
n = len(nums)
result_f = p
for i in range(1,n):
r = max(p+nums[i],nums[i])
result_f = max(result_f,r)
p = r
max_f=result_f
#跨界
q = nums[0]
result_t_1 = q
for i in range(1,n-1):
s = min(q+nums[i], nums[i])
result_t_1 = min(result_t_1,s)
q = s
max_t_1 = sum(nums)-result_t_1
q = nums[1]
result_t_2 = q
for i in range(2,n):
s = min(q+nums[i], nums[i])
result_t_2 = min(result_t_2,s)
q = s
max_t_2 = sum(nums)-result_t_2
return max(max_f,max_t_1,max_t_2)
通过!