• 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)));
        }
    };




  • 相关阅读:
    C 语言的读取文件
    [Water]序号呼唤
    [Water]Hdu 1022 Train Problem I
    [Water]Hdu 2054 A == B ?
    Java竞赛可能会用到的东西
    [Huffman]Hdu 2527 Safe Or Unsafe
    [Prim]Poj 1258 Agri-Net
    Hdu 1257 最少拦截系统 (LIS、贪心)
    [Max Sum]hdu 1003
    Hdu 2566 统计硬币
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/7084260.html
Copyright © 2020-2023  润新知