53 最大子串和Maximum Subarray

分治法python

def maxSub(nums,left,right):
    if left==right:
        return nums[left]
    mid = int((left+right)/2)
    print("mid=",mid)
    leftmax = maxSub(nums,left, mid)
    rightmax = maxSub(nums,mid+1,right)
    mid_left_sum = 0
    mid_right_sum = 0
    mid_left_max = -float('inf')
    mid_right_max = -float('inf')
    for i in reversed(nums[left:mid+1]):
        print("nums[left:mid+1]: ",nums[left:mid+1])
        mid_left_sum += i
        if mid_left_sum>mid_left_max:
            mid_left_max = mid_left_sum
    for i in nums[mid+1:right+1]:
        print("nums[mid+1:right]: ",nums[mid+1:right+1])
        mid_right_sum += i
        if mid_right_sum>mid_right_max:
            mid_right_max = mid_right_sum
    mid_max = mid_left_max + mid_right_max
    maxes = [leftmax,rightmax,mid_max]
    print("maxes = ",maxes)
    res = max(maxes)
    return res
    
    
def maxSubArray( nums):
        left = 0
        right = len(nums)-1
        
        return maxSub(nums,left,right)
# [-2,1,-3,4,-1,2,1,-5,4]
# [1]
# [5,4,-1,7,8]
print(maxSubArray([5,4,-1,7,8]))

动态规划

class Solution
{
public:
    int maxSubArray(vector<int> &nums)
    {
        //类似寻找最大最小值的题目,初始值一定要定义成理论上的最小最大值
        int result = INT_MIN;
        int numsSize = int(nums.size());
        int sum = 0;
        for (int i = 0; i < numsSize; i++)
        {
            sum += nums[i];
            result = max(result, sum);
            //如果sum < 0,重新开始找子序串
            if (sum < 0)
            {
                sum = 0;
            }
        }

        return result;
    }
};

作者:pinku-2
链接:https://leetcode-cn.com/problems/maximum-subarray/solution/zui-da-zi-xu-he-cshi-xian-si-chong-jie-fa-bao-li-f/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        n = len(nums)
        max_sum_ending_curr_index = max_sum = nums[0]
        for i in range(1, n):
            max_sum_ending_curr_index = max(max_sum_ending_curr_index + nums[i], nums[i])
            max_sum = max(max_sum_ending_curr_index, max_sum)

        return max_sum
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值