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




  • 相关阅读:
    通过java代码获取jvm信息和系统信息
    java cp与java jar的区别
    vue下实现WebRTC
    MANIFEST.MF文件详解
    element 前端排序 与 后端排序
    JAVA获取CPUID、主板序列号、硬盘序列号、MAC地址(自己验证过)
    PHP常用代码大全
    程序员从初级到中级10个秘诀
    移动平台还有哪些创业机会
    程序员招聘:如何识别真正的程序员
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/7084260.html
Copyright © 2020-2023  润新知