LeetCode刷题(27)~最大子序和【暴力+贪心+动态规划+分治 难点:分治】

题目描述

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

示例:

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

进阶:

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

解答 By 海轰

提交代码(暴力解法-超时)

int maxSubArray(vector<int>& nums) {
        int len=nums.size();
        int max=nums[0];
        
        for(int i=1;i<=len;++i)
        {
         for(int j=0;j<=len-i;++j)
         {
             int temp=0;
             for(int k=j;k<j+i;++k)
             {
                 temp+=nums[k];
                 if(max<temp)
                 max=temp;
             }
         }
        }
        return max;
    }

运行结果
在这里插入图片描述
提交代码(贪心)

int maxSubArray(vector<int>& nums) {
         int len=nums.size();
        int curmax=nums[0];
        int result=nums[0];
        for(int i=1;i<len;++i)
        {
            if(curmax<0)
            {
                curmax=nums[i];
                result=max(result,curmax);
            }
            else
            {
                curmax+=nums[i];
                result=max(result,curmax);
            }
            
        }
        return result;
    }

运行结果
LeetCode刷题(27)~最大子序和【暴力+贪心+动态规划+分治 难点:分治】_第1张图片

其他解答

  • 动态规划
  • 分治【难点】

动态规划

int maxSubArray_3(vector<int>& nums) {
        int pre = 0, maxAns = nums[0];
        for (const auto &x: nums) {
            pre = max(pre + x, x);
            maxAns = max(maxAns, pre);
        }
        return maxAns;
    }

LeetCode刷题(27)~最大子序和【暴力+贪心+动态规划+分治 难点:分治】_第2张图片

C++测试代码

#include 
#include
using namespace std;
// 方法一:暴力 注:超时
int maxSubArray_1(vector<int>& nums) {
        int len=nums.size();
        int max=nums[0];
        
        for(int i=1;i<=len;++i)
        {
         for(int j=0;j<=len-i;++j)
         {
             int temp=0;
             for(int k=j;k<j+i;++k)
             {
                 
                 temp+=nums[k];
                 if(max<temp)
                 max=temp;
             }
         }
        }
        return max;
    }
// 方法二:贪心 
    int maxSubArray_2(vector<int>& nums) {
        int len=nums.size();
        int curmax=nums[0];
        int result=nums[0];
        for(int i=1;i<len;++i)
        {
            if(curmax<0)
            {
                curmax=nums[i];
                result=max(result,curmax);
            }
            else
            {
                curmax+=nums[i];
                result=max(result,curmax);
            }
            
        }
        return result;
    }
// 方法三:贪心
int maxSubArray_3(vector<int>& nums) {
        int pre = 0, maxAns = nums[0];
        for (const auto &x: nums) {
            pre = max(pre + x, x);
            maxAns = max(maxAns, pre);
        }
        return maxAns;
    }

int main()
{
    vector<int> a;
    a.push_back(-2);
    a.push_back(-3);
    a.push_back(-3);
    a.push_back(4);
    a.push_back(-1);
    a.push_back(2);
    a.push_back(1);
    a.push_back(-5);
    a.push_back(4);
cout<<maxSubArray_3(a)<<endl;
    return 0;
}

题目来源

链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xn3cg3/
来源:力扣(LeetCode)

你可能感兴趣的:(算法,leetcode)