zoukankan      html  css  js  c++  java
  • LeetCode53: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.

    一:动态规划的解法

    初始状态A[i]表示以小标i结尾的子数组的最大和和,

    那么A[i+1]=max{A[i],0}+nums[i]

    输出结果为max{A[i]}。

    时间复杂度是O(n)。空间复杂度是O(1)。

    runtime:12ms。

    class Solution {
    public:
        int maxSubArray(vector<int>& nums) {
            int length=nums.size();
            int result=nums[0];
            int current=nums[0];
            for(int i=1;i<length;i++)
            {
                current=max(current,0)+nums[i];
                if(current>result)
                    result=current;
            }
            return result;
        }
    };

    二:分治法

    这道题还能够使用分治法来求解。
    分治法的说明例如以下图:

    时间复杂度是o(nlogn),空间复杂度是o(1)。
    runtime:16ms
    class Solution {
    public:
        int maxSubArray(vector<int>& nums) {
            
            return divide(nums,0,nums.size()-1);
        }
        
        int divide(vector<int> & nums,int left,int right)
        {
            if(left==right)
                return nums[left];
            if(left>right)
                return numeric_limits<int>::min();
            int mid=left+(right-left)/2;
            int sum=0;
            int leftMax=0;
            for(int i=mid-1;i>=left;i--)
            {
                sum+=nums[i];
                leftMax=max(leftMax,sum);
            }
            sum=0;
            int rightMax=0;
            for(int i=mid+1;i<=right;i++)
            {
                sum+=nums[i];
                rightMax=max(rightMax,sum);
            }
            int tmp=leftMax+rightMax+nums[mid];
            return max(tmp,max(divide(nums,left,mid-1),divide(nums,mid+1,right)));
        }
    };




  • 相关阅读:
    Asp.net SignalR 实现服务端消息推送到Web端
    C#使用Quartz.NET详解
    Ubuntu 安装部署hugegraph
    chapter10.1、异常处理
    chapter13.2、SQLAlchemy
    chapter9.5、描述器
    chapter9.3、可调用对象,上下文管理
    chapter9.4、魔术方法反射
    chapter9.1、魔术方法
    chapter7.1、数据分发与队列queue
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/7084260.html
Copyright © 2011-2022 走看看