53、最大子数组和

题目描述:给你一个整数数组 nums,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组是数组中的一个连续部分。
示例 1:
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
示例 2:
输入:nums = [1]
输出:1
示例 3:
输入:nums = [5,4,-1,7,8]
输出:23

1. 暴力
两层循环,计算任意起点到任意重点的值,求最大值,喜提超时。

    int maxSubArray(vector<int>& nums) {
        int ans=INT32_MIN,tep=0;//INT21_MIN十进制表示为−2147483648
        int n=nums.size();
        for(int i=0;i<n;i++){
            tep=0;
            for(int j=i;j<n;j++){
                tep+=nums[j];
                if(tep>ans) ans=tep;
                }
            }
        return ans;
    }

2. 动态规划
能否用动态规划在于两个点:(1)问题答案依赖于问题规模。(2)问题答案可由小规模问题的递推。步骤:(1)建立状态转移方程。(2)存储之前的结果。(3)从小到大开始计算。
对于本题,把 f ( i ) f(i) f(i)看做以第i个数为终点的最大子数组和,则状态转移方程:
f ( i ) = m a x ( f ( i − 1 ) + n u m s [ i ] , n u m s [ i ] ) f(i)=max(f(i-1)+nums[i],nums[i]) f(i)=max(f(i−1)+nums[i],nums[i])

    int maxSubArray(vector<int>& nums) {
        int pre=0,maxa=nums[0];
        for(auto i:nums){
            pre=max(pre+i,i);
            maxa=max(pre,maxa);
        }
        return maxa;
    }

3. 分治
还没弄懂。。

上一篇:services之Endpoints


下一篇:LeetCode 53: 最大子序和