连续数列-力扣

https://leetcode-cn.com/problems/contiguous-sequence-lcci/

  • 题目

给定一个整数数组,找出总和最大的连续数列,并返回总和。

示例:

输入: [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
进阶:

如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解

  • 动态规划
class Solution:
    def maxSubArray(self,s:List[int]) ->int: # 定义函数
        if s==[]: #当输入为空时
            return #返回为空
        else:
            for i in range(1,len(s)): # 数组不为空时,从索引1开始循环直至结束
                s[i]=max(s[i]+s[i-1],s[i]) #重新定义数组 例如 两个一组 max时定义成一组 再与下一个进行比较
            return max(s)  #返回最大的总和

                #int 对象不可迭代!:return max(s[i])改成 return max(s)即可
                #s[i]表示数组中int的具体值;s表示更新之后的值
                #动态规划
                #总结:
                #(1)考虑是否为空
                #(2)不为空时,s[i]=max(s[i]+s[i-1],s[i])(此思路挺重要)
                #(3)输出时,retun返回 max(s)
                #时间复杂度:O(n) 空间复杂度:O(1)

以上参考出处:https://leetcode-cn.com/problems/contiguous-sequence-lcci/solution/dong-tai-gui-hua-by-yi-wen-statistics-13/

  • 分治算法
class Solution {
public:
        // 分治法
    int maxSubArray(vector<int>& nums)
    {
        if(nums.size() == 0) return INT_MIN;
        return divide(nums,0,nums.size()-1);
    }
    int divide(vector<int>& nums, int left, int right)
    {
        if(left == right) return nums[left];
        int mid = (left + right) / 2;
        // 1. 最大数列和在左边
        int sumLeft = divide(nums,left,mid);
        // 2. 最大数列和在右边
        int sumRight = divide(nums,mid+1,right);
        // 3. 最大数列和在中间
        // 先求左边的最大和
        int leftSum = 0,leftMaxSum = INT_MIN;
        for(int i = mid; i >= left; i--)
        {
            leftSum += nums[i];
            leftMaxSum = max(leftMaxSum,leftSum);
        }
        // 求右边的最大和
        int rightSum = 0,rightMaxSum = INT_MIN;
        for(int i = mid + 1; i <= right; i++)
        {
            rightSum += nums[i];
            rightMaxSum = max(rightMaxSum,rightSum);
        }
        return max(max(sumLeft,sumRight),leftMaxSum+rightMaxSum);
    }
};

参考出处:https://leetcode-cn.com/problems/contiguous-sequence-lcci/solution/fen-zhi-he-dong-tai-gui-hua-liang-chong-jie-fa-by-/

  • 反思
    事实证明,对于我而言, python 思路确实比其他思路容易理解,且能够想的到;不过其他思路也是要学习的
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值